Я новичок в XAML, WPF (первый проект ;-)). Моя цель - применить настраиваемый combobox, объявленный внутри App.xaml. Однако, если я затем использую combobox внутри MainWindow.xaml, я не знаю, как присоединить обработчик кликов к togglebutton, который закреплен внутри combobox. Если я добавлю свойство Click в ToggleButton внутри App.xaml, мне удалось захватить это событие, если я реализую обработчик внутри App.cs.Кнопка Toggle (внутри combobox) attach click handler
То, что я пытался до сих пор:
Обратитесь к ToggleButton внутри ComboBox элемента в MainWindow.xaml (я не имею хорошую интуицию, как XAML работ в этой точке ...), который приводит к некоторым нежелательным визуальным эффектам на ToggleButton и не более того.
<ComboBox x:Name="someComboBox" Height="23" Margin="122,35,1.8,0" VerticalAlignment="Top"> <ToggleButton Click="toggleHandler_Click" />
Fetch ToggleButton из MainWindow.cs, а затем присоединить обработчик, хотя бывший с подходами ниже результатов обнулить
ToggleButton tBtn = ((ComboBox)someComboBox).FindName("MyToggleButton") as ToggleButton; // null ToggleButton tBtn = LogicalTreeHelper.FindLogicalNode(someComboBox, "MyToggleButton"); // null
Вот подгонять выпадающий внутри App.xaml, который я принял как есть
<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
Нет, я не ошибаюсь. Просто не знаю, какова наилучшая практика для захвата события. Нет проблем с обработкой события click в приложении App.cs, если я добавлю свойство Click в ToggleButton внутри App.xaml. Тем не менее я хочу обработать событие в контексте MainWindow. – crishushu