2016-07-19 381 views
2

私のアプリケーションでは、使用しているコンボボックスに角が丸くなるようにする必要があります。私はthis questionへの答えに投稿されたXAMLで始まり、いくつかの変更を加えました。私は私がそれほど多く見える方法が気に入らないと決めたので、私はそれをスタイルして、デフォルトのコンボボックスのように見せてみました。今私のコンボボックスには、次のようになります。enter image description here角が丸いWPFコンボボックスを作成する

をし、ドロップダウンするとき:

enter image description here

問題は、ユーザーがコンボボックス上にマウスを置いたときに、それはこのようになっていることである:enter image description hereが。私はSnoopを使用している場合は、私がこの情報を見ることができます:

enter image description here

それはマウスが終わったとき、その境界線の背景の値を示した色であると「#FFBEE6FD」を、設定されていることを 言いますコンボボックス。値のソースは「ParentTemplateTrigger」です。私の問題は、この国境がどこから来ているのか、それがなぜその価値を得ているのか分かりません。私は、背景を白に設定するためのセッターでテンプレートトリガーを追加しようとしましたが、この不思議な境界の値をどこに設定するのかはわかりません。ここで

は私のコンボボックスのためのXAMLです:

<ComboBox x:Name="ScanSizesComboBox" 
       Style="{StaticResource roundedCornersComboBox}" 
       Grid.ZIndex="4" 
       ItemsSource="{Binding ScanSizes}" 
       SelectedItem="{Binding SelectedScanSize, Mode=TwoWay}" 
       ToolTip="{Binding (Validation.Errors)[0].ErrorContent}" 
       Margin="0,10,89,0" 
       HorizontalAlignment="Right" 
       Width="61" 
       Height="26" 
       VerticalAlignment="Top" 
       Grid.Row="4"> 

    </ComboBox> 

そして、ここではスタイルです:

<Style x:Key="ComboBoxTextBoxStyle" TargetType="{x:Type TextBox}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type TextBox}"> 
       <Grid> 
        <Border Name="ComboBoxTextBoxStyleBorder" CornerRadius="2" 
         BorderThickness="0,1,0,1" 
          Margin="0,0,1,1" 
         Background="{TemplateBinding Background}"> 
         <Border.Style> 
          <Style TargetType="Border"> 
           <Style.Triggers> 
            <Trigger Property="IsMouseOver" Value="true"> 
             <Setter Property="Background" Value="White"/> 
            </Trigger> 

           </Style.Triggers> 
          </Style> 
         </Border.Style> 
         <ScrollViewer x:Name="PART_ContentHost"/> 
        </Border> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    <Setter Property="IsReadOnly" Value="True"/> 
</Style> 

<!--Rounded corners combo box--> 
<Style TargetType="{x:Type ComboBox}" x:Key="roundedCornersComboBox"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type ComboBox}"> 
       <Border Name="roundedCornerComboBoxBorder" BorderBrush="#CCCCCC" BorderThickness="1" CornerRadius="3" ClipToBounds="True" Background="White"> 
        <Border.Style> 
         <Style TargetType="Border"> 
          <Style.Triggers> 
           <Trigger Property="IsMouseOver" Value="true"> 
            <Setter Property="Background" Value="White"/> 
           </Trigger> 

          </Style.Triggers> 
         </Style> 
        </Border.Style> 
        <Canvas> 
         <Grid> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition/> 
          </Grid.ColumnDefinitions> 
          <TextBox Name="PART_EditableTextBox" 
            Panel.ZIndex="0" 
            Style="{StaticResource ComboBoxTextBoxStyle}" 
            Padding="0,0,0,0" 
            IsHitTestVisible="False" 
            Height="{TemplateBinding Height}"> 
          </TextBox> 
          <ToggleButton Grid.Column="1" Margin="0, 0, 0, 0" 
             Panel.ZIndex="1" 
             HorizontalAlignment="Center" 
             VerticalAlignment="Center" 
             BorderBrush="Transparent" 
             Background="Transparent" 
             Height="{TemplateBinding Height}" 
             Width="60" 
             IsChecked="{Binding Path=IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" 
             HorizontalContentAlignment="Right" 
             ClickMode="Press"> 

           <ToggleButton.Style> 
            <Style TargetType="ToggleButton"> 
             <Style.Triggers> 
              <Trigger Property="IsMouseOver" 
                Value="true"> 
               <Setter Property="Background" 
                 Value="White" /> 
              </Trigger> 
             </Style.Triggers> 
            </Style> 
           </ToggleButton.Style> 

           <Path Grid.Column="1" 
             HorizontalAlignment="Center" 
             VerticalAlignment="Center" 
             Data="M 0 0 L 4 4 L 8 0 Z" 
             Fill="DodgerBlue" /> 
          </ToggleButton> 
          <ContentPresenter Name="ContentSite" 
               Cursor="Arrow" 
              Content="{TemplateBinding SelectionBoxItem}" 
              ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}" 
              ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}" 
              VerticalAlignment="Center" 
              HorizontalAlignment="Left" 
              Margin="3,0,0,0"> 
          </ContentPresenter> 
          <Popup Name="Popup" 
            Placement="Bottom" 
            IsOpen="{TemplateBinding IsDropDownOpen}" 
            AllowsTransparency="True" 
            Focusable="False" 
            PopupAnimation="Slide"> 
           <Grid Name="DropDown" 
             SnapsToDevicePixels="True"     
             MinWidth="{TemplateBinding ActualWidth}" 
             MaxHeight="{TemplateBinding MaxDropDownHeight}"> 
            <Border 
             x:Name="DropDownBorder" 
             BorderThickness="1" 
             CornerRadius="5" 
             Background="White" 
             BorderBrush="Black"/> 
            <ScrollViewer Margin="4,6,4,6" SnapsToDevicePixels="True"> 
             <StackPanel IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Contained" /> 
            </ScrollViewer> 
           </Grid> 
          </Popup> 
         </Grid> 
        </Canvas> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

最終的に、私は上の彼/彼女のマウスを置くことができるようにユーザーのための希望しますコンボボックスをクリックして、強調表示されていないときと同じように見えるようにします。どんな助けもありがとうございます。ありがとう。

+0

私は実際には正しいものではなく、詳細に近いものではないことを前にコメントしておきましたので、私はそれをお詫びします。あなたが実際に紛失していることと、本当に丸められる前に解決しなければならない問題は、ComboBoxのデフォルトテンプレートから始まり、次に「ComboBoxToggleButton」、「ComboBoxEditableTextBox」、「ComboBoxItem」、およびそのテンプレートCornerRadiusをオンにする必要がある複数の境界線、完全なスタイリングを実現するためにRadiusX、RadiusYを設定する複数のRectangleがあります。 –

+0

あなたのコメントに基づいて作業し、ComboBoxのデフォルトのテンプレートから始めようとしていました。しかし、テンプレートをインポートして編集しようとすると、コンバータに関するエラーが発生します。これは、テンプレートを変更する前です。エラーは[ここ](http://imgur.com/k7Gclpk)です。私は[MahApps](http://mahapps.com/)を使用していますが、どういうわけかテンプレートはそのフレームワークからコンバーターを使用しようとしていますか?なぜ私は分からない。 – KSF

+0

ああ、既にテンプレート化されたコントロール(mahapps)を使用していて、ちょうどolで開始したと仮定します。右クリック - >テンプレートの編集 - >コピー(または現在の)ルートを編集しますか?あなたはすでにCLRではないかもしれないものを引き出しています。ただちにエラーが発生する場合は、リソースディクショナリにそのコンバータを見つけるための名前空間を追加するだけで簡単です。 MahAppsの詳細は初めに知っておいた方が良いでしょう。 :) –

答えて

1

私たちのコメントの会話(これは一般的に、あまりにも多くのノイズを避けようとしています)から引き続き、これがあなたのトラックに表示される可能性があります。

したがって、私は新鮮なWPFアプリケーションからベアボーンの基本デフォルト値のComboBoxComboBoxItemにテンプレートのものをすべて取り込むと、これが出力されます。すべての機能が必要なわけではありませんが、期待されるすべての機能とDOM部分が参照できるようにある程度まで確実にする必要があるため、トリガー、テンプレートバインディングなどのすべてが利用できます。

すべての丸めを実現するために、さまざまな部分にさまざまな要素(BorderおよびRectangle)を変更する必要があることに注意してください。しかし、私が経験してきたMahAppsには、それが本質的に何を達成するために自分のものを作ったのかということから、MahAppsに何が影響するのかについての洞察はありません。

希望します。 SOの提出要件では長すぎますが、こちらはPasteBin linkです。

関連する問題