2015-11-14 11 views
0

Надеюсь, вы сможете помочь мне в этом вопросе. Я разрабатываю универсальное приложение Windows (приложение для планшетов), в котором я использую всплывающие окна XAML. Когда я показываю всплывающее окно с использованием «popup.isOpen = true», и я установил высоту и ширину всплывающего окна. Проблема в том, что остальные элементы управления в окне также доступны.сделать оставшуюся часть окна недоступной

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

Ваши предложения/рекомендации будут очень полезными.

XAML

<Page 
x:Name="PageName" 
x:Class="TryingVariousThings.MainPage" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:local="using:TryingVariousThings" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
mc:Ignorable="d"> 

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 
    <StackPanel> 
     <TextBlock Text="IsReadOnlyProperty Binding One" FontSize="29.333"></TextBlock> 
    <TextBlock x:Name="tbkOne" Text="{Binding Text,ElementName=tbOne}" FontSize="29.333"></TextBlock> 
     <TextBox x:Name="tbOne" IsReadOnly="{Binding ElementName=PageName, Path=setAsReadOnly, Mode=OneWay}" /> 
     <Button Content="Disable editing" x:Name="bDisableEditing" Click="bDisableEditing_Click"></Button> 
     <Button Content="Enable editing" x:Name="bEnableEditing" Click="bEnableEditing_Click"></Button> 
     <Button x:Name="bCustomPopup" Content="Show Custom Popup" Click="bCustomPopup_Click"></Button> 
    </StackPanel> 
    <Popup x:Name="PopupOne" 
      IsOpen="False" 
      > 
     <Grid 
      Background="Aqua" 
      Width="800" 
      Height="400"> 
     <Button Width="200" Content="popupButton"></Button> 
     </Grid> 
    </Popup> 

</Grid> 

XAML.cs

private void bCustomPopup_Click(object sender, RoutedEventArgs e) 
    { 
     PopupOne.Height = 400; 
     PopupOne.Width = 800; 
     PopupOne.IsOpen = true; 
    } 
+0

Popup не нравится диалог по крайней мере, с точки зрения WinRT, также вы можете 't style dialogs, поэтому мне пришлось использовать некоторые пользовательские диалоги для достижения желаемого клиента. Мы использовали библиотеку под названием Callisto, и это «CustomDialog», но мне пришлось сделать много хаков, чтобы сделать backgorund элементы управления недоступными не только для прикосновений, но и для пользователей с клавиатурой (такие клавиши, как вкладка). Помимо этого вы можете попытаться поместить сетку или другой элемент управления поверх всего экрана и показать его пользователю с темной маской для достижения эффекта серого цвета, а также уничтожить все события. Другой вариант - отключить все элементы управления. – kirotab

+0

Привет Киротаб, спасибо за ваши предложения. Я попробовал «PageName.IsEnabled = false;» PageName - это главная страница, в которой у меня есть все элементы управления и всплывающие окна стека. это отключает доступ к другим элементам управления. Но также отключает элементы управления всплывающим окном, поскольку всплывающее окно находится внутри страницы. После отключения страницы я не смог сделать «PopupOne.isEnabled», этого свойства там не было. Есть идеи? – BRDroid

+0

Я также пробовал, так как у меня было несколько минут, чтобы проверить, но кажется, что IsEnabled отсутствует во многих элементах управления в Universal ... Или, по крайней мере, это выглядит так. Я попытался также с 'container.IsHitTestVisible = false;' где контейнер - панель стека, но вы можете обойтись со вкладкой и щелкнуть по кнопкам сзади ... Возможно, если вы также удалите 'IsTabStop' из элементов управления, которые вы можете эмулировать поведение, но я не могу найти это свойство ... – kirotab

ответ

0

Вот один из способов сделать это.

ПРИМЕЧАНИЕ. Я основываю свои предложения от приложения Windows 8.1 WinRT, а не универсального приложения - если все в порядке, я извиняюсь заранее, я просто надеюсь, что это положит вас на правильный путь.

Во-первых, сделайте всплывающее окно на весь экран. Обратите внимание, что я создаю всплывающее окно с кодом.

 Popup popup = new Popup() 
     { 
      Height = Window.Current.Bounds.Height, 
      IsLightDismissEnabled = false, 
      Width = Window.Current.Bounds.Width 
     }; 

     popup.SetValue(Canvas.LeftProperty, 0); 
     popup.SetValue(Canvas.TopProperty, 0); 

Далее создайте <UserControl> для содержания и в вашем XAML, сделать что-то вроде этого:

<Grid> 
    <Grid Background="Black" Opacity="0.4"/> 

    <Grid HorizontalAlignment="Stretch" VerticalAlignment="Center" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" Height="Auto"> 
     <!-- Make sure the set the height and width based on % or something, so it looks good --> 
     <RestOfYourXAML/> 
    </Grid> 
</Grid> 

Таким образом, вы «покрыть» весь экран (визуальный эффект, что делает его, кажется, инвалидов) ,

Наконец, определить содержание всплывающего и показать:

 MyUserControl popupContent = new MyUserControl(); 
     popup.Child = messageDialog; 
     popup.IsOpen = true; 

Обратите внимание, что я хочу, чтобы мой Всплывающие походить системы всплывающих окон, так что они охватывают всю ширину доступного экрана и только изменения высоты. Вы можете, конечно, изменить это, как вам будет угодно, указав ширину и высоту <Grid>, которая содержит фактический контент в XAML.

+0

Привет, я пробовал, как вы сказали мне, что я сделал сетку внутри всплывающего окна всю ширину и высоту, а горизонтальные и вертикальные выровняли элементы управления. Это именно то, что я хотел, но элементы управления всплывающего окна тоже выглядели серыми. сохраняйте серое выделение сетки, но не элементы управления? – BRDroid

+0

@ Rao Я заметил из вашего собственного ответа ... Я не дал вам достаточно информации. XAML не для '', а скорее для' ' который позже будет использоваться как содержимое «Popup». Я отредактирую свой ответ. – Shaamaan

+0

@ Rao Также обратите внимание, что «черная сетка» на самом деле не содержит никакого контента. эффект o n других элементов управления. И, наконец, это должно быть ПЕРЕД другим содержимым в XAML или иначе это сделает все более темным, как вы описали. – Shaamaan

0

OK Вот пример обходного пути, который мы обсуждали в комментариях к вашему ответу. Если есть лучший способ, вы будете рады узнать.

Что мы делаем:

  • Bind наш контейнер IsHitTestVisible свойство IsOpen свойство всплывающего окна

  • Bind наши InterACT-возможность управления имуществом IsTabStop к IsOpen всплывающего окна

  • Используйте обратный конвертер bool для получения желаемых значений (напротив IsOpen)

  • Stretch размер первого элемента всплывающего окна, который является приграничным, которую мы используем, чтобы применить затемненную маску (темного цвета с непрозрачностью) до размера curent окна (сделано в коде позади)

  • При нажатии кнопки кнопка во всплывающем окне закрывает всплывающее окно, и все видно и взаимодействовать, в состоянии снова

XAML

<Page.Resources> 
    <local:BoolToOppositeConverter x:Name="OppositeBoolConverter" /> 
    <SolidColorBrush x:Key="GrayMaskColorBrush" Color="#88000000" /> 
</Page.Resources> 
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" x:Name="container"> 
    <StackPanel 
     IsHitTestVisible="{Binding Path=IsOpen, ElementName=PopupOne, Converter={StaticResource OppositeBoolConverter}}"> 
     <TextBlock x:Name="tbkZero" Text="IsReadOnlyProperty Binding One" FontSize="29.333"></TextBlock> 
     <TextBlock x:Name="tbkOne" Text="{Binding Text,ElementName=tbOne}" FontSize="29.333"></TextBlock> 
     <TextBox x:Name="tbOne" IsReadOnly="{Binding ElementName=PageName, Path=setAsReadOnly, Mode=OneWay}" 
       IsTabStop="{Binding Path=IsOpen, ElementName=PopupOne,Converter={StaticResource OppositeBoolConverter}}"/> 
     <Button Content="Disable editing" x:Name="bDisableEditing" Click="bDisableEditing_Click" 
       IsTabStop="{Binding Path=IsOpen, ElementName=PopupOne, Converter={StaticResource OppositeBoolConverter}}"/> 
     <Button Content="Enable editing" x:Name="bEnableEditing" Click="bEnableEditing_Click" 
       IsTabStop="{Binding Path=IsOpen, ElementName=PopupOne, Converter={StaticResource OppositeBoolConverter}}"/> 
     <Button x:Name="bCustomPopup" Content="Show Custom Popup" Click="bCustomPopup_Click" 
       IsTabStop="{Binding Path=IsOpen, ElementName=PopupOne, Converter={StaticResource OppositeBoolConverter}}"/> 
    </StackPanel> 
    <Popup x:Name="PopupOne" 
      IsOpen="False" 
      IsLightDismissEnabled="False"> 
     <Border x:Name="popupMask" Background="{StaticResource GrayMaskColorBrush}"> 
      <Grid Background="White" Width="800" Height="400"> 
       <Button Width="200" Content="popupButton" Click="Button_Click"/> 
      </Grid> 
     </Border> 
    </Popup> 
</Grid> 

Главная страница - код за

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

private void bCustomPopup_Click(object sender, RoutedEventArgs e) 
{ 
    popupMask.Width = Window.Current.Bounds.Width; 
    popupMask.Height = Window.Current.Bounds.Height; 

    Window.Current.SizeChanged += Current_SizeChanged; 

    PopupOne.IsOpen = true; 
} 

private void Current_SizeChanged(object sender, Windows.UI.Core.WindowSizeChangedEventArgs e) 
{ 
    popupMask.Width = Window.Current.Bounds.Width; 
    popupMask.Height = Window.Current.Bounds.Height; 
} 

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    PopupOne.IsOpen = false; 
    Window.Current.SizeChanged -= Current_SizeChanged; 
} 

конвертер для противоположного BOOL

class BoolToOppositeConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, string language) 
    { 
     return !(bool)value; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, string language) 
    { 
     return !(bool)value; 
    } 
} 

EDIT затруднительное когда окно изменения размера и использования нового связывания {х: затруднительное}

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

Также, когда мы создаем универсальное приложение, вы можете использовать новый синтаксис для связывания (они сказали, что это быстрее, чем старый, но это недобросовестный OneTime вместо OneWay поэтому мы должны установить режим вручную)

"{x:Bind PopupOne.IsOpen, Converter={StaticResource OppositeBoolConverter}, Mode=OneWay}" 

вы могли бы использовать это вместо предыдущего связывания примера

+0

Привет Киротаб Я пробовал, как предложил Шааман, который был немного прост, возможно, это тоже поможет. но у меня была проблема, хотя всплывающее окно тоже кажется серым. Позвольте мне разместить XAMl и XAML.cs отдельно. – BRDroid

0

Как было предложено Шааманом и h elp kirotab, вот мои XAML и Xaml.cs, чтобы вырезать фон всплывающего окна. Всплывающее окно установлено на ширину и высоту окна, а затем панель стека элементов управления центрирована. , но только элементы управления всплывающим окном тоже выглядят серыми. В любом случае, я могу анти-серый всплывающие элементы управления?

EDIT: изменено значение OPACITY на 0,9, и это исправлено. БЛАГОДАРЯ SHAAMAN И KIROTAB за помощь мне

XAML

<Page 
x:Name="PageName" 
x:Class="TryingVariousThings.MainPage" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:local="using:TryingVariousThings" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
mc:Ignorable="d"> 


<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 
    <StackPanel x:Name="spControls"> 

     <Button x:Name="bCustomPopup" Content="Show Custom Popup" Click="bCustomPopup_Click"></Button> 


    </StackPanel> 

     <Popup x:Name="PopupOne" 
      IsOpen="{Binding ElementName=PageName, Path=setPopup, Mode=OneWay}"> 
     <Grid 
      x:Name="gridPopupOne" 
      Background="Black" 
      Opacity="0.9"> 
       <StackPanel Orientation="Vertical" 
          HorizontalAlignment="Center" 
          VerticalAlignment="Center"> 
       <Button Content="Cancel Popup" x:Name="bCancelPopup" Click="bCancelPopup_Click"></Button> 
       <TextBox Text="abcd"></TextBox> 
       </StackPanel> 
      </Grid> 
    </Popup> 

</Grid> 

XAML.cs

private void bCustomPopup_Click(object sender, RoutedEventArgs e) 
    { 


     gridPopupOne.Height = Window.Current.Bounds.Height; 
     gridPopupOne.Width = Window.Current.Bounds.Width; 
     setPopup = true; 
    } 

    public static readonly DependencyProperty IsPopup = DependencyProperty.Register(
     "setPopup", 
     typeof(bool), 
     typeof(MainPage), 
     new PropertyMetadata(false) 
    ); 

    public bool setPopup 
    { 
     get { return (bool)GetValue(IsPopup); } 
     set { SetValue(IsPopup, value); } 

    } 

    private void bCancelPopup_Click(object sender, RoutedEventArgs e) 
    { 
     setPopup = false; 
    } 
+0

Это ... не то, что я предложил, но я рад, что это сработало для вас.Кроме того, если вам помогли другие ответы, почему бы не ответить на эти вопросы? – Shaamaan

Смежные вопросы