如何设置WPF组合框的样式,使其看起来更像以前的版本

时间:2018-03-15 19:37:36

标签: c# .net wpf xaml

我的目标是在WPF中设置一个组合框,使其看起来像旧版本的组合框。我的意思是旧的组合框有明显的白色文本框和右端的灰色切换按钮。请参阅下面的图片 New and old comboboxes

我希望组合框有一些属性,例如“togglebutton背景”,我可以简单地改变,但似乎并非如此。我想知道下面的代码是否是正确的开始。

settext Label1.caption & textbox1.text & Chr(13) _
        & textbox2.text & Chr(13) _
        & Textbox3.text & "etc. " _
        & "etc."

通过搜索本网站上的帖子,我的起点是编辑默认组合框的控件模板。这提供了大约300行代码来定义控件的样式,在我看来并不容易理解。

这篇文章WPF Change Background color of a Combobox有一些类似于我想要的组合框的代码,但是我希望有人可以更多地解释这个过程,而不仅仅是发布代码,因为我会对各种控件做很多小调整。

任何人都可以告诉我,如果我在正确的轨道上,从哪里开始?此外,一旦我有一些工作,重用这种新模板样式的最佳方法是什么,以便它可以在其他应用程序中使用?谢谢你的帮助!

@zack raiyan我本质上尝试通过代码中已经存在的togglebutton和controlbox模板粘贴该代码中的两个模板。这给了我一个无效标记错误。你看到我做错了吗?代码

<ToggleButton x:Name="toggleButton" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Grid.ColumnSpan="2" IsChecked="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" Style="{StaticResource ComboBoxToggleButton}"/>
<ContentPresenter x:Name="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}"/>

1 个答案:

答案 0 :(得分:2)

更好的一个:

必需属性

#!/usr/bin/env perl
# edit file.xml file and save new one in new.xml
use strict; use warnings;

use XML::LibXML;

my $xl = XML::LibXML->new();
my $xml = $xl->load_xml(location => 'file.xml') ;

for my $node ($xml->findnodes('//userName/text()')) {
    my $value = $node->getValue;
    print $value;
    $value =~ s/\s+/_/g;
    $node->setData($value);
}

$xml->toFile('new.xml');

Window.Resources中的ComboBox ControlTemplate

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

示例:

<SolidColorBrush x:Key="ComboBoxNormalBorderBrush" Color="#e3e9ef" />
<SolidColorBrush x:Key="ComboBoxNormalBackgroundBrush" Color="#fff" />
<SolidColorBrush x:Key="ComboBoxDisabledForegroundBrush" Color="#888" />
<SolidColorBrush x:Key="ComboBoxDisabledBackgroundBrush" Color="#eee" />
<SolidColorBrush x:Key="ComboBoxDisabledBorderBrush" Color="#888" />

<ControlTemplate TargetType="ToggleButton" x:Key="ComboBoxToggleButtonTemplate">
<Grid>
  <Grid.ColumnDefinitions>
    <ColumnDefinition />
    <ColumnDefinition Width="20" />
  </Grid.ColumnDefinitions>
  <Border Grid.ColumnSpan="2" Name="Border"
          BorderBrush="{StaticResource ComboBoxNormalBorderBrush}" 
          CornerRadius="0" BorderThickness="1, 1, 1, 1" 
          Background="{StaticResource ComboBoxNormalBackgroundBrush}" />
  <Border Grid.Column="1" Margin="1, 1, 1, 1" BorderBrush="#444" Name="ButtonBorder"
          CornerRadius="0, 0, 0, 0" BorderThickness="0, 0, 0, 0" 
          Background="{StaticResource ComboBoxNormalBackgroundBrush}" />

  <Path Name="Arrow" Grid.Column="1" 
        Data="M0,0 L0,2 L4,6 L8,2 L8,0 L4,4 z"
        HorizontalAlignment="Center" Fill="#444"
        VerticalAlignment="Center" />
</Grid>
<ControlTemplate.Triggers>
  <Trigger Property="UIElement.IsMouseOver" Value="True">
    <Setter Property="Panel.Background" TargetName="ButtonBorder" Value="WhiteSmoke"/>
  </Trigger>
  <Trigger Property="ToggleButton.IsChecked" Value="True">
    <Setter Property="Panel.Background" TargetName="ButtonBorder" Value="WhiteSmoke"/>
    <Setter Property="Shape.Fill" TargetName="Arrow" Value="#FF8D979E"/>
  </Trigger>
  <Trigger Property="UIElement.IsEnabled" Value="False">
    <Setter Property="Panel.Background" TargetName="Border" Value="{StaticResource ComboBoxDisabledBackgroundBrush}"/>
    <Setter Property="Panel.Background" TargetName="ButtonBorder" Value="{StaticResource ComboBoxDisabledBackgroundBrush}"/>
    <Setter Property="Border.BorderBrush" TargetName="ButtonBorder" Value="{StaticResource ComboBoxDisabledBorderBrush}"/>
    <Setter Property="TextElement.Foreground" Value="{StaticResource ComboBoxDisabledForegroundBrush}"/>
    <Setter Property="Shape.Fill" TargetName="Arrow" Value="#999"/>
  </Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>

<Style x:Key="ComboBoxFlatStyle"  TargetType="{x:Type ComboBox}">
<Setter Property="UIElement.SnapsToDevicePixels" Value="True"/>
<Setter Property="FrameworkElement.OverridesDefaultStyle" Value="True"/>
<Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto"/>
<Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/>
<Setter Property="ScrollViewer.CanContentScroll" Value="True"/>
<Setter Property="TextElement.Foreground" Value="Black"/>
<Setter Property="FrameworkElement.FocusVisualStyle" Value="{x:Null}"/>
<Setter Property="Control.Template">
  <Setter.Value>
    <ControlTemplate TargetType="ComboBox">
      <Grid>
        <ToggleButton Name="ToggleButton" Grid.Column="2"
            ClickMode="Press" Focusable="False"
            IsChecked="{Binding Path=IsDropDownOpen, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}"
            Template="{StaticResource ComboBoxToggleButtonTemplate}"/>

        <ContentPresenter Name="ContentSite" Margin="5, 3, 23, 3" IsHitTestVisible="False"
                          HorizontalAlignment="Left" VerticalAlignment="Center"                              
                          Content="{TemplateBinding ComboBox.SelectionBoxItem}" 
                          ContentTemplate="{TemplateBinding ComboBox.SelectionBoxItemTemplate}"
                          ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}"/>
        <TextBox Name="PART_EditableTextBox" Margin="3, 3, 23, 3"                     
                 IsReadOnly="{TemplateBinding IsReadOnly}"
                 Visibility="Hidden" Background="Transparent"
                 HorizontalAlignment="Left" VerticalAlignment="Center"
                 Focusable="True" >
          <TextBox.Template>
            <ControlTemplate TargetType="TextBox" >
              <Border Name="PART_ContentHost" Focusable="False" />
            </ControlTemplate>
          </TextBox.Template>
        </TextBox>
        <!-- Popup showing items -->
        <Popup Name="Popup" Placement="Bottom"
               Focusable="False" AllowsTransparency="True"
               IsOpen="{TemplateBinding ComboBox.IsDropDownOpen}"
               PopupAnimation="Slide">
          <Grid Name="DropDown" SnapsToDevicePixels="True"
                MinWidth="{TemplateBinding FrameworkElement.ActualWidth}"
                MaxHeight="{TemplateBinding ComboBox.MaxDropDownHeight}">
            <Border Name="DropDownBorder" Background="White" Margin="0, 1, 0, 0"
                    CornerRadius="0" BorderThickness="1,1,1,1" 
                    BorderBrush="{StaticResource ComboBoxNormalBorderBrush}"/>
            <ScrollViewer Margin="4" SnapsToDevicePixels="True">
              <ItemsPresenter KeyboardNavigation.DirectionalNavigation="Contained" />
            </ScrollViewer>
          </Grid>
        </Popup>
      </Grid>
      <ControlTemplate.Triggers>
        <Trigger Property="ItemsControl.HasItems" Value="False">
          <Setter Property="FrameworkElement.MinHeight" TargetName="DropDownBorder" Value="95"/>
        </Trigger>
        <Trigger Property="UIElement.IsEnabled" Value="False">
          <Setter Property="TextElement.Foreground" Value="{StaticResource ComboBoxDisabledForegroundBrush}"/>
        </Trigger>
        <Trigger Property="ItemsControl.IsGrouping" Value="True">
          <Setter Property="ScrollViewer.CanContentScroll" Value="False"/>
        </Trigger>
        <Trigger Property="ComboBox.IsEditable" Value="True">
          <Setter Property="KeyboardNavigation.IsTabStop" Value="False"/>
          <Setter Property="UIElement.Visibility" TargetName="PART_EditableTextBox" Value="Visible"/>
          <Setter Property="UIElement.Visibility" TargetName="ContentSite" Value="Hidden"/>
        </Trigger>
      </ControlTemplate.Triggers>
    </ControlTemplate>
   </Setter.Value>
   </Setter>
   </Style>