2016-07-18 23 views
0

私は新人のXAML、WPF(最初のプロジェクト;-))です。私の目標は、App.xaml内で宣言されたカスタマイズされたコンボボックスを適用することです。しかし、MainWindow.xaml内でコンボボックスを使用すると、コンボボックス内に固定されたトグルボタンにクリックハンドラを接続する方法がわかりません。 App.xaml内のToggleButtonにClickプロパティを追加すると、App.cs.x内でハンドラを実装するとイベントをキャプチャすることに成功しました。Toggleボタン(コンボボックス内)クリックハンドラをアタッチする

  • は、MainWindow.xamlでコンボボックスの要素(私はこの時点でどのようにXAMLの作品の良い勘を持っていない...)内のトグルボタンを参照してください:私がこれまで試したどのような

    結果としてToggleButtonに望ましくない視覚効果が生じ、それ以上のことはありません。

    <ComboBox x:Name="someComboBox" 
          Height="23" 
          Margin="122,35,1.8,0" 
          VerticalAlignment="Top"> 
    
         <ToggleButton Click="toggleHandler_Click" /> 
    
  • は、MainWindow.csからトグルボタンを取得した後

    ToggleButton tBtn = ((ComboBox)someComboBox).FindName("MyToggleButton") as ToggleButton; // null 
    
        ToggleButton tBtn = LogicalTreeHelper.FindLogicalNode(someComboBox, "MyToggleButton"); // null 
    
  • ここ

がApp.xaml内部カスタマイズコンボボックスであるnullに結果を以下の手法で前者が、ハンドラをアタッチ私が採用したのは

 <Style TargetType="ComboBox"> 
      <Setter Property="Validation.ErrorTemplate" Value="{x:Null}" /> 
      <Setter Property="VerticalAlignment" Value="Center" /> 
      <Setter Property="OverridesDefaultStyle" Value="true" /> 
      <Setter Property="IsEditable" Value="True"/> 
      <Setter Property="SnapsToDevicePixels" Value="true" /> 
      <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto" /> 
      <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto" /> 
      <Setter Property="ScrollViewer.CanContentScroll" Value="true" /> 
      <Setter Property="Margin" Value="2" /> 
      <Setter Property="MinHeight" Value="20" /> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="ComboBox"> 
         <Grid> 
          <VisualStateManager.VisualStateGroups> 
           <VisualStateGroup x:Name="CommonStates"> 
            <VisualState x:Name="Normal"/> 
            <VisualState x:Name="MouseOver"/> 
            <VisualState x:Name="Disabled"/> 
           </VisualStateGroup> 
          </VisualStateManager.VisualStateGroups> 
          <ToggleButton x:Name="MyToggleButton" 
              Grid.Column="2" 
              ClickMode="Press" 
              Focusable="false" 
              IsChecked="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" 
              Template="{StaticResource ComboBoxToggleButton}"/> 

          <ContentPresenter Margin="3,3,23,3" 
               Content="{TemplateBinding SelectionBoxItem}" 
               ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}" 
               ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}" 
               HorizontalAlignment="Left" 
               IsHitTestVisible="False" 
               x:Name="ContentSite" 
               VerticalAlignment="Center" /> 

          <TextBox Style="{x:Null}" 
            x:Name="PART_EditableTextBox" 
            Margin="3,3,23,3" 
            Background="Transparent" 
            Focusable="True" 
            HorizontalAlignment="Left" 
            IsReadOnly="{TemplateBinding IsReadOnly}" 
            Template="{StaticResource ComboBoxTextBox}" 
            VerticalAlignment="Center" 
            Visibility="Hidden" /> 

          <Popup AllowsTransparency="True" Focusable="False" IsOpen="{TemplateBinding IsDropDownOpen}" x:Name="Popup" Placement="Bottom" PopupAnimation="Fade"> 
           <Grid MaxHeight="{TemplateBinding MaxDropDownHeight}" MinWidth="{TemplateBinding ActualWidth}" x:Name="DropDown" SnapsToDevicePixels="True"> 
            <Border x:Name="DropDownBorder" Background="White" BorderBrush="{StaticResource BorderDarkMainBrush}" BorderThickness="1" CornerRadius="0" /> 
            <ScrollViewer Margin="2" SnapsToDevicePixels="True"> 
             <StackPanel KeyboardNavigation.DirectionalNavigation="Contained" IsItemsHost="True" TextBlock.Foreground="Black" /> 
            </ScrollViewer> 
           </Grid> 
          </Popup> 
         </Grid> 
         <ControlTemplate.Triggers> 
          <Trigger Property="HasItems" Value="false"> 
           <Setter Property="MinHeight" TargetName="DropDownBorder" Value="95" /> 
          </Trigger> 
          <Trigger Property="IsGrouping" Value="true"> 
           <Setter Property="ScrollViewer.CanContentScroll" Value="false" /> 
          </Trigger> 
          <Trigger Property="IsEditable" Value="true"> 
           <Setter Property="IsTabStop" Value="false" /> 
           <Setter Property="Visibility" TargetName="PART_EditableTextBox" Value="Visible" /> 
           <Setter Property="Visibility" TargetName="ContentSite" Value="Hidden" /> 
          </Trigger> 
         </ControlTemplate.Triggers> 

        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
      <Style.Triggers> 
       <Trigger Property="IsFocused" Value="True"> 
        <Setter Property="Background" Value="Transparent" /> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
+0

あなたが 'ComboBox'の中のボタンをクリックするとエラーが出ますか? – XAMlMAX

+0

いいえ、私は何の誤りもありません。イベントをキャプチャするためのベストプラクティスは何か分かりません。 App.xaml内のToggleButtonにClickプロパティを追加すると、App.csのclickイベントを処理する問題はありません。それでもMainWindowのコンテキストでイベントを処理したいと思います。 – crishushu

答えて

0

最初のブロックのXAMLでは、ToggleButton ComboBoxの子としてだから、この方法ですべてのアイテムをループすることができます:

foreach(ToggleButton btn in someComboBox.Items) 
{ 
    btn.Click += event_handler; 
} 

しかし、私はあなたが正確に必要なものを理解していません! :-)

+0

あなたの提案を試して、 'btn'に 'InvalidCastException'があります。また、someComboBoxオブジェクトのメンバーを移動すると、ToggleButtonを見つけることができません。 – crishushu

関連する問題