2015-03-25 2 views
1

Я пытаюсь добиться следующего:WPF всплывающее обыкновение близко даже с StaysOpen = «ложь»

  1. пользователя вызывает контекстное меню в сетке.
  2. Пользователь выбирает элемент контекстного меню, который затем открывает всплывающее окно и отображает некоторую информацию.
  3. Когда пользователь нажимает в другом месте приложения, а не во всплывающем окне, всплывающее окно закрывается.

Все работает нормально, пока не придет к закрытию всплывающего окна.

От поиска в другом месте я знаю, что мне нужно, чтобы Staysopen был установлен в false (это он) Я также прочитал, что лучший способ - привязать значение IsOpen к свойству в модели представления и установить его привязку к 2 (также сделано)

В качестве побочного примечания я обнаружил, что если я добавлю текстовое поле и щелкнув внутри окна, когда я затем выйду за пределы всплывающего окна, он закрывается по желанию.

Еще одна вещь, которую я безуспешно пытался использовать в качестве обходного пути, заключалась в том, чтобы программно настроить фокус клавиатуры на текстовое поле, чтобы получить желаемую «автоклинирующую» функциональность.

Вот код:

XAML -

<Popup Name="PredictionsPopup" Height="200" Width="200" AllowsTransparency="false" StaysOpen="False" IsOpen="{Binding DisplaySummaryPopup, Mode=TwoWay}"> 
      <StackPanel Background="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"> 
       <TextBlock Text="here is some stuff" /> 
       <TextBox Name="hiddenBox" Text="moo"/> 
      </StackPanel>   
     </Popup> 

Codebehind, который устанавливает свойство на ViewModel при выборе пункта меню.

private void CurrentPredicitions_OnClick(object sender, RadRoutedEventArgs e) 
     { 

      PredictionsPopup.Placement = PlacementMode.MousePoint; 
      ViewModel.DisplaySummaryPopup = true; 

     } 

ViewModel недвижимость

public bool? DisplaySummaryPopup 
     { 
      get 
      { 
       return this.displaySummaryPopup; 
      } 

      set 
      { 
       this.displaySummaryPopup = value; 
       RaisePropertyChanged(() => this.DisplaySummaryPopup); 
      } 
     } 

Пожалуйста, дайте мне знать, если вам нужно больше деталей.

ответ

1

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

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

Чтобы обойти мою проблему, я добавил кнопку закрытия для всплывающего окна, а затем всякий раз, когда активная вкладка элемента управления, в котором размещается всплывающее окно, меняет событие, которое всплывающее окно поднимает и закрывает.

2

Здесь сталкивается с рабочим примером:

MainWindow XAML:

<Window x:Class="WpfApplication2.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <Popup Name="PredictionsPopup" Height="200" Width="200" AllowsTransparency="false" StaysOpen="False" IsOpen="{Binding DisplaySummaryPopup, Mode=TwoWay}"> 
      <StackPanel Background="Red"> 
       <TextBlock Text="here is some stuff" /> 
       <TextBox Name="hiddenBox" Text="moo"/> 
      </StackPanel> 
     </Popup> 
     <DataGrid AutoGenerateColumns="False" Name="dataGrid1" IsReadOnly="True" > 
      <DataGrid.Columns> 
       <DataGridTextColumn Header="Site" Width="150" /> 
       <DataGridTextColumn Header="Subject" Width="310" /> 
      </DataGrid.Columns> 
      <DataGrid.ContextMenu> 
       <ContextMenu> 
        <MenuItem Header="Click Me" Click="ButtonBase_OnClick">      
        </MenuItem> 
       </ContextMenu> 
      </DataGrid.ContextMenu> 
     </DataGrid> 


    </Grid> 
</Window> 

MainWindow CS:

public MainWindow() 
     { 
      InitializeComponent(); 
      DataContext = new TestViewModel(); 
     } 

     private void ButtonBase_OnClick(object sender, RoutedEventArgs e) 
     { 
      PredictionsPopup.Placement = PlacementMode.MousePoint; 
      PredictionsPopup.IsOpen = true; 

     } 

ViewModel:

public class TestViewModel : INotifyPropertyChanged 
    { 
     private bool _displaySumarry; 
     public bool DisplaySummaryPopup 
     { 
      get { return _displaySumarry; } 
      set 
      { 
       _displaySumarry = value; 
       OnPropertyChanged(); 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 

     protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
     { 
      var handler = PropertyChanged; 
      if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

Я думаю, что ваша реализация для я NotifyPropertyChanged - это тот, который вызывает проблему. Я попробовал сам код и сейчас работаю.