2016-07-18 3 views
0

Я новичок в 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> 
+0

Когда вы запускаете приложение и нажимаете кнопку внутри вашего 'ComboBox', вы получаете какую-либо ошибку? – XAMlMAX

+0

Нет, я не ошибаюсь. Просто не знаю, какова наилучшая практика для захвата события. Нет проблем с обработкой события click в приложении App.cs, если я добавлю свойство Click в ToggleButton внутри App.xaml. Тем не менее я хочу обработать событие в контексте MainWindow. – crishushu

ответ

0

С вашим первым блоком XAML вы добавили ToggleButton как ребенок ComboBox. Таким образом, вы можете соединить все предметы таким образом:

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

Но я не понимаю, что вам нужно точно! :-)

+0

Пробовал ваше предложение и получил «InvalidCastException» на «btn». Также, когда я перемещаю элементы объекта someComboBox, я просто не могу определить ToggleButton. – crishushu