私は新人の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>
あなたが 'ComboBox'の中のボタンをクリックするとエラーが出ますか? – XAMlMAX
いいえ、私は何の誤りもありません。イベントをキャプチャするためのベストプラクティスは何か分かりません。 App.xaml内のToggleButtonにClickプロパティを追加すると、App.csのclickイベントを処理する問題はありません。それでもMainWindowのコンテキストでイベントを処理したいと思います。 – crishushu