2013-04-14 35 views
1

我有一個彈出控件,它有一個按鈕。應該在組合框打開時顯示彈出框,並在關閉時消失。 我的代碼如下所示:帶有一個按鈕綁定到組合框的彈出控件

<Popup Name="myPopup" IsOpen="{Binding Path=IsDropDownOpen, ElementName=combo}" 
     Placement="Right" PlacementTarget="{Binding ElementName=combo}" 
     StaysOpen="False" Focusable="False" 
       AllowsTransparency="True" PopupAnimation="Fade" > 
    <Button Click="Popup_Click"> 
     <Image Source="..\Images\edit.png" Height="30"/> 
    </Button> 
</Popup> 

<ComboBox Name="combo" SelectedValuePath="Key" DisplayMemberPath="Value" 
      Loaded="ComboBox_Loaded" SelectedValue="{Binding FamilyStatus}"> 
</ComboBox> 

而且功能:

private void ComboBox_Loaded(object sender, RoutedEventArgs e) 
{ 
    combo.ItemsSource = GetComboValues(); 
} 

在這段代碼中我有一個問題: 組合框打開時並得到閉合時的組合是彈出窗口顯示關閉,但點擊按鈕(從彈出窗口內)不會被解僱!我想這是因爲,當鼠標移動到按鈕時,彈出設置的「IsOpen」爲假,因此點擊不再被觸發。 我嘗試了不同的方法設置ISOPEN =「假」,並與組合框事件打開彈出:

DropDownOpened =「ComboBox_Loaded_DropDownOpened」和StaysOpen =「假」

private void ComboBox_Loaded_DropDownOpened(object sender, EventArgs e) 
{ 
    myPopup.IsOpen = true; 
    myPopup.StaysOpen = false; 
} 

但隨後彈出的住宿即使我在窗口上選擇了不同的文本框並且該按鈕的點擊事件僅在兩次單擊後才被打開,也可以打開。 (如果我添加一個DropDownClosed="ComboBox_Loaded_DropDownClosed"事件來關閉彈出窗口,再次彈出消失,然後我可以按下按鈕)。 任何人都可以幫助解決方案嗎?

回答

0

你應該重新模板你的組合框,所以屬性IsDropDownOpen不會再影響它,然後你可以強制組合框保持打開狀態,即使他失去了焦點。我使用的屬性標籤,以取代IsDropDownOpen並設置StaysOpen =兩個彈出窗口(同樣在組合框模板)

這裏真的是代碼:

組合框模板:

<Style x:Key="ComboBoxStyle1" TargetType="{x:Type ComboBox}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type ComboBox}"> 
        <Grid x:Name="MainGrid" SnapsToDevicePixels="true"> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition Width="*"/> 
          <ColumnDefinition MinWidth="{DynamicResource {x:Static SystemParameters.VerticalScrollBarWidthKey}}" Width="0"/> 
         </Grid.ColumnDefinitions> 
         <Popup x:Name="PART_Popup" StaysOpen="True" AllowsTransparency="true" Grid.ColumnSpan="2" IsOpen="{Binding Tag, RelativeSource={RelativeSource TemplatedParent}}" Margin="1" PopupAnimation="{DynamicResource {x:Static SystemParameters.ComboBoxPopupAnimationKey}}" Placement="Bottom"> 
          <Microsoft_Windows_Themes:SystemDropShadowChrome x:Name="Shdw" Color="Transparent" MaxHeight="{TemplateBinding MaxDropDownHeight}" MinWidth="{Binding ActualWidth, ElementName=MainGrid}"> 
           <Border x:Name="DropDownBorder" BorderBrush="{DynamicResource {x:Static SystemColors.WindowFrameBrushKey}}" BorderThickness="1" Background="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"> 
            <ScrollViewer x:Name="DropDownScrollViewer"> 
             <Grid RenderOptions.ClearTypeHint="Enabled"> 
              <Canvas HorizontalAlignment="Left" Height="0" VerticalAlignment="Top" Width="0"> 
               <Rectangle x:Name="OpaqueRect" Fill="{Binding Background, ElementName=DropDownBorder}" Height="{Binding ActualHeight, ElementName=DropDownBorder}" Width="{Binding ActualWidth, ElementName=DropDownBorder}"/> 
              </Canvas> 
              <ItemsPresenter x:Name="ItemsPresenter" KeyboardNavigation.DirectionalNavigation="Contained" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> 
             </Grid> 
            </ScrollViewer> 
           </Border> 
          </Microsoft_Windows_Themes:SystemDropShadowChrome> 
         </Popup> 
         <ToggleButton BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}" Grid.ColumnSpan="2" IsChecked="{Binding Tag, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}"> 
          <ToggleButton.Style> 
           <Style TargetType="{x:Type ToggleButton}"> 
            <Setter Property="OverridesDefaultStyle" Value="true"/> 
            <Setter Property="IsTabStop" Value="false"/> 
            <Setter Property="Focusable" Value="false"/> 
            <Setter Property="ClickMode" Value="Press"/> 
            <Setter Property="Template"> 
             <Setter.Value> 
              <ControlTemplate TargetType="{x:Type ToggleButton}"> 
               <Microsoft_Windows_Themes:ButtonChrome x:Name="Chrome" BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}" RenderMouseOver="{TemplateBinding IsMouseOver}" RenderPressed="{TemplateBinding IsPressed}" SnapsToDevicePixels="true"> 
                <Grid HorizontalAlignment="Right" Width="{DynamicResource {x:Static SystemParameters.VerticalScrollBarWidthKey}}"> 
                 <Path x:Name="Arrow" Data="M 0 0 L 3.5 4 L 7 0 Z" Fill="Black" HorizontalAlignment="Center" Margin="3,1,0,0" VerticalAlignment="Center"/> 
                </Grid> 
               </Microsoft_Windows_Themes:ButtonChrome> 
               <ControlTemplate.Triggers> 
                <Trigger Property="IsChecked" Value="true"> 
                 <Setter Property="RenderPressed" TargetName="Chrome" Value="true"/> 
                </Trigger> 
                <Trigger Property="IsEnabled" Value="false"> 
                 <Setter Property="Fill" TargetName="Arrow" Value="#AFAFAF"/> 
                </Trigger> 
               </ControlTemplate.Triggers> 
              </ControlTemplate> 
             </Setter.Value> 
            </Setter> 
           </Style> 
          </ToggleButton.Style> 
         </ToggleButton> 
         <ContentPresenter ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}" ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}" Content="{TemplateBinding SelectionBoxItem}" ContentStringFormat="{TemplateBinding SelectionBoxItemStringFormat}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" IsHitTestVisible="false" Margin="{TemplateBinding Padding}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> 
        </Grid> 
        <ControlTemplate.Triggers> 
         <Trigger Property="HasDropShadow" SourceName="PART_Popup" Value="true"> 
          <Setter Property="Margin" TargetName="Shdw" Value="0,0,5,5"/> 
          <Setter Property="Color" TargetName="Shdw" Value="#71000000"/> 
         </Trigger> 
         <Trigger Property="HasItems" Value="false"> 
          <Setter Property="Height" TargetName="DropDownBorder" Value="95"/> 
         </Trigger> 
         <Trigger Property="IsEnabled" Value="false"> 
          <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/> 
          <Setter Property="Background" Value="#FFF4F4F4"/> 
         </Trigger> 
         <Trigger Property="IsGrouping" Value="true"> 
          <Setter Property="ScrollViewer.CanContentScroll" Value="false"/> 
         </Trigger> 
         <Trigger Property="ScrollViewer.CanContentScroll" SourceName="DropDownScrollViewer" Value="false"> 
          <Setter Property="Canvas.Top" TargetName="OpaqueRect" Value="{Binding VerticalOffset, ElementName=DropDownScrollViewer}"/> 
          <Setter Property="Canvas.Left" TargetName="OpaqueRect" Value="{Binding HorizontalOffset, ElementName=DropDownScrollViewer}"/> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

你代碼:

<Popup x:Name="myPopup" IsOpen="{Binding Tag, ElementName=combo}" 
    Placement="Right" PlacementTarget="{Binding ElementName=combo}" 
    StaysOpen="True" Focusable="False" 
      AllowsTransparency="True" PopupAnimation="Fade" > 
      <Button Click="Popup_Click"> 
       <Image Source="..\Images\edit.png" Height="30"/> 
      </Button> 
     </Popup> 

     <ComboBox Name="combo" SelectedValuePath="Key" DisplayMemberPath="Value" 
     Loaded="ComboBox_Loaded" SelectedValue="{Binding FamilyStatus}" Style="{StaticResource ComboBoxStyle1}"> 
     </ComboBox> 
+0

謝謝您的回覆。它工作良好,但現在即使按下窗口中的另一個控件,組合框也不會關閉,並且組合框的選定值在打開組合框時未標記。 – user2155957

相關問題