2013-04-14 2 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"이 false로 설정되어 클릭이 더 이상 시작되지 않기 때문입니다.

DropDownOpened = "ComboBox_Loaded_DropDownOpened"및 StaysOpen = "거짓"

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

그러나 팝업 숙박 : 나는 ISOPEN = "false"로 설정하고 콤보 이벤트와 팝업을 여는 다른 접근 방식을 시도 창에서 다른 텍스트 상자를 선택해도 단추의 클릭 이벤트가 두 번 클릭 한 후에야 발생합니다. (팝업을 닫기 위해 DropDownClosed="ComboBox_Loaded_DropDownClosed" 이벤트를 추가하면 버튼을 누르기 전에 다시 팝업이 사라집니다.) 아무도 솔루션을 도울 수 있습니까?

답변

0

속성을 IsDropDownOpen이 더 이상 영향을 미치지 않도록 콤보 상자를 retemplate해야합니다. 그리고 포커스를 잃어 버렸더라도 콤보를 계속 열어 둘 수 있습니다. 나는 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

관련 문제