2014-05-06 67 views
0

我在這裏遇到了wpf社區的問題。 我有點無法理解路由隧道事件。在我的應用程序中,我有一個包含工具欄的窗口。 窗口還包含用戶控件。工具欄中有一些控件,如視圖,用於像Visual Studio中一樣隱藏/取消隱藏用戶控件(視圖)。wpf中的路由隧道事件

我在Windows控件中有自定義的路由隧道事件。在工具欄上單擊按鈕時隱藏/取消隱藏,我會引發自定義事件。當點擊按鈕時,我需要在child usercontrol(名稱類似「Expander 1」)中隱藏一個擴展器。

有人可以告訴我如何捕獲兒童用戶控件中的引發事件嗎?

謝謝。

代碼窗口:

public partial class MainWindow : Window 
    { 
     private static readonly RoutedEvent HideShowMitigationEvent; 

     static MainWindow() 
      { 
      HideShowMitigationEvent = EventManager.RegisterRoutedEvent("HideShowMitigation", 
       RoutingStrategy.Tunnel, typeof(RoutedEventHandler), typeof(MainWindow)); 
      } 

     public MainWindow() 
      { 
      InitializeComponent(); 
      } 

     // The Standard .Net optional event wrapper 
     // This is required if we want to register the event handler in XAML  
     public event RoutedEventHandler HideShowMitigation 
      { 
      add { AddHandler(HideShowMitigationEvent, value); } 
      remove { RemoveHandler(HideShowMitigationEvent, value); } 
      } 

     // Raise the event. overidden from UIElement  
     protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e) 
      { 
      // RaiseEvent(new RoutedEventArgs(HideShowMitigationEvent, this)); 
      } 


     public static ExploredRisks _rootName { get; set; } 

     public MainWindow(GeneralTree<string> rawTreeData, Excel.Worksheet sheet,Excel.Workbook Wb) 
     { 

      //prepares the visual tree for other views 
      PrepareVisualTree visualTree = new PrepareVisualTree(rawTreeData, sheet); 
      _rootName = visualTree.getVisualTree(); 
      var l_vm = new MainViewModel(); 
      l_vm.Load(_rootName); 
      TreeListViewMultiColumned view = new TreeListViewMultiColumned(RiskViewModel.CreateTestModel(visualTree.getVisualTree()),sheet,Wb); 


      base.DataContext = l_vm; 
      InitializeComponent(); 

     } 

     private void UIPanel_Loaded(object sender, RoutedEventArgs e) 
     { 

     } 


     private void RibbonCheckBox_Checked(object sender, RoutedEventArgs e) 
     { 

      RaiseEvent(new RoutedEventArgs(HideShowMitigationEvent, this)); 
     } 

     private void SimpleClickEventHandlingCode(object sender, RoutedEventArgs e) 
      { 
      //Expander exp = ((MainWindow)(e.OriginalSource)).RiskProperties.MitigationArea; 
       RoutedEventArgs args = new RoutedEventArgs(); 
       args.RoutedEvent = HideShowMitigationEvent; 
       RaiseEvent(args); 
      } 
    } 
} 

窗口的XAML:

<Window> 


     <Ribbon x:Name="RibbonWin" SelectedIndex="0"> 
      <RibbonTab Header="Views" KeyTip="H"> 
       <!-- Home group--> 
       <RibbonGroup x:Name="ViewsGroup" Header="Views"> 
        <RibbonCheckBox Label="Mitigation" IsChecked="{Binding IsChecked, Mode=TwoWay}" Checked="RibbonCheckBox_Checked" PreviewMouseDown="SimpleClickEventHandlingCode"/> 
        <RibbonCheckBox Label="Properties" IsChecked="{Binding IsChecked, Mode=TwoWay}" Checked="RibbonCheckBox_Checked" /> 
       </RibbonGroup> 
      </RibbonTab> 
     </Ribbon> 
    <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="*" /> 
      </Grid.ColumnDefinitions> 
      <UI:TreeListViewMultiColumned x:Name="RiskProperties" Grid.Column="0" /> 
     </Grid> 
</Window> 

回答

0

我想我要澄清關於WPF路由事件之前,我提出一個解決方案:

在WPF中有一個路由事件的新概念。路由事件是沿邏輯樹傳遞的事件。

例如: 讓我們來看看當您單擊UI上的按鈕時會發生什麼。 首先,您將看到在MainWindow上發生的PreviewLeftMouseButtonDown事件,然後沿父元素向下傳遞元素樹,直到它到達已單擊的按鈕。 - >這個過程(從父到子)被稱爲隧道

其次,你會得到發生在按鈕上,直到它到達主窗口向上傳遞的元素樹LeftMouseButtonDown事件。 - >這個過程(從小孩到父母)被稱爲冒泡

據我所知,你想打開擴展器的點擊按鈕。 IMG使用路由事件是不適合的方法。

我認爲你可以用一點XAML來解決你的用例。以下是我建議:

  • 您使用工具欄切換按鈕(這確保了用戶可以 看到按鈕的狀態,例如按下或未按)
  • 您使用數據綁定綁定ToggleButtons IsChecked屬性爲 Expanders IsExpanded屬性。

檢查以下(高度簡化)示例:

<Grid> 
    <StackPanel> 
    <ToggleButton x:Name="openExpanderBtn" Width="100" Height="30" Margin="20" Content="Click to Open" /> 
    <Expander Width="150" Height="200" IsExpanded="{Binding ElementName=openExpanderBtn, Path=IsChecked}" > 
     <Expander.Header> 
      This is my Header 
     </Expander.Header> 
     This is my Body 
    </Expander> 
    </StackPanel> 

備註:這只是來到我的腦海裏,如果用戶控件這隻能是你的控制之下。如果是這種情況:好的,否則我會介紹另一種解決方案。 Rgds MM

+0

謝謝,但它不工作的方式,你解釋它。我試過了。儘管isChecked設置爲true,但綁定不會相應地將擴展器可見性設置爲true或false。 –

+0

代碼中必須存在問題。如果你發佈你的當前代碼,我會看看它。 –