2017-01-30 10 views
0

У меня есть всплывающее окно, и когда пользователь меняет данные на нем, я хочу сделать его полностью недоступным во время загрузки содержимого. Я достиг этого с помощью других элементов управления, имея сетку с ProgressRing в самой высокой точке Z-индекса, которую я показываю перед загрузкой данных и скрытием после.Наложение над вылетом

Проблема в том, что всплывающее окно делает все выше, что делает его доступным. Даже установка свойства IsEnabled на странице «False» позволяет контролировать внутри него видимые объекты.

Вот скриншот проблемы:

Что это выглядит как:

(выпадающий список интерактивна)

Что это должно выглядеть следующим образом: enter image description here

(ComboBox не является интерактивным)

Любые идеи о том, как это можно решить?

ответ

0

Не уверен, если я правильно вас понял, но вы можете попробовать с IsHitTestVisible и непрозрачностью свойства вас Выпадающая Материалы. Я сделал простой пример того, как это может работать - XAML страницы:

<Page.Resources> 
    <local:NullableToBool x:Key="NullConverter"/> 
</Page.Resources> 

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" Width="400" Height="200"> 
    <ProgressRing Width="100" Height="100" Margin="50" HorizontalAlignment="Left" VerticalAlignment="Center" Visibility="Visible" 
        IsActive="{x:Bind TheButton.IsChecked, Mode=OneWay, Converter={StaticResource NullConverter}}"/> 
    <Button Content="Show flyout" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="50"> 
     <Button.Flyout> 
      <Flyout> 
       <Border Background="Gray" IsHitTestVisible="{x:Bind IsActive, Mode=OneWay}" Opacity="{x:Bind FlyoutOpacity, Mode=OneWay}"> 
        <ToggleButton Margin="20" x:Name="TheButton" IsChecked="False" Click="TheButton_Click" Content="Doing smth" Width="100"/> 
       </Border> 
      </Flyout> 
     </Button.Flyout> 
    </Button> 
</Grid> 

и код позади:

public class NullableToBool : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, string language) 
    { 
     return value is bool ? (bool)value : false; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, string language) 
    { 
     throw new NotImplementedException(); 
    } 
} 

public sealed partial class MainPage : Page, INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
    private void RaiseProperty(string name) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); 

    private bool isActive = true; 
    public bool IsActive 
    { 
     get { return isActive; } 
     set { isActive = value; RaiseProperty(nameof(IsActive)); } 
    } 

    private double flyoutOpacity = 1.0; 
    public double FlyoutOpacity 
    { 
     get { return flyoutOpacity; } 
     set { flyoutOpacity = value; RaiseProperty(nameof(FlyoutOpacity)); } 
    } 

    public MainPage() 
    { 
     this.InitializeComponent(); 
    } 

    private async void TheButton_Click(object sender, RoutedEventArgs e) 
    { 
     IsActive = false; 
     FlyoutOpacity = 0.1; 
     await Task.Delay(3000); 
     IsActive = true; 
     FlyoutOpacity = 1.0; 
     (sender as ToggleButton).IsChecked = false; 
    } 
} 
0

Если вы просто хотите, чтобы заблокировать пользовательский интерфейс в то время как ProgressRing показ. Вы можете использовать ModalDialog в Template10.

Практически каждое приложение имеет необходимость отображать некоторую форму модального диалога - элемент пользовательского интерфейса, который блокирует взаимодействие с остальной частью приложения до тех пор, пока пользователь не отклонит его или не выполнит какую-либо задачу приложения.