2

Win7テーマとWin8テーマの両方で通常のボタンのように見えるWPF分割ボタンを知っている人はいますか?私はWin7に似合うが、Win8では親指のように突き出るものを使用しています。

変なボタン

codeplexでWPFSplitbuttonプロジェクト、Extended WPFToolkitのBananaSplitbuttonおよびsplitbuttonを試しました。

Win7でWin7をテーマにしたボタンとWin8でWin8をテーマにしたボタンを提供するものはありますか?

コントロールにバインド可能なCommandプロパティがあり、下矢印が押されたときにコンテキストメニューを表示する必要があります。

4

3 に答える 3

2

私はStenのアプローチ、つまりボタンを別のボタンの中にネストするというアプローチを採用しました。ユーザーコントロールを使用して再利用可能にし、すべての要素をコントロールテンプレートに配置して、ボタン内に任意のコンテンツを配置できるようにしました。

<UserControl 
  x:Class="VidCoder.Controls.SplitButton"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
  xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  mc:Ignorable="d"
  Loaded="SplitButton_OnLoaded">
  <UserControl.Template>
    <ControlTemplate TargetType="{x:Type UserControl}">
      <Button 
        HorizontalAlignment="Left" VerticalAlignment="Top" Name="mainButton" ContextMenuService.Placement="Bottom" 
        Width="{TemplateBinding Width}" Height="{TemplateBinding Height}">
        <Button.Content>
          <StackPanel Orientation="Horizontal" UseLayoutRounding="True">
            <ContentPresenter Margin="{TemplateBinding Padding}" />
            <Rectangle Width="1" Fill="#111111" Margin="0,2" />
            <Button Click="OnArrowClick">
              <Button.Template>
                <ControlTemplate TargetType="Button">
                  <Grid Background="Transparent" Name="buttonGrid">
                    <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
                  </Grid>
                </ControlTemplate>
              </Button.Template>
              <Button.Content>
                <Path Data="M 0,0 L 8,0 L 4,4 Z" Fill="{TemplateBinding Foreground}" Margin="4 0 3 0" VerticalAlignment="Center"/>
              </Button.Content>
            </Button>
          </StackPanel>
        </Button.Content>
        <Button.ContextMenu>
          <ContextMenu Name="buttonMenu" ItemsSource="{Binding Path=MenuItemsSource, RelativeSource={RelativeSource TemplatedParent}}" />
        </Button.ContextMenu>
      </Button>
    </ControlTemplate>
  </UserControl.Template>
</UserControl>

コードビハインドは、メニュー項目コレクションとCommandプロパティを公開します。

public partial class SplitButton : UserControl
{
    private Button button;

    private ObservableCollection<object> menuItemsSource = new ObservableCollection<object>();

    public Collection<object> MenuItemsSource { get { return this.menuItemsSource; } }

    public SplitButton()
    {
        InitializeComponent();
    }

    public static readonly DependencyProperty CommandProperty = DependencyProperty.Register(
        "Command",
        typeof (ICommand),
        typeof (SplitButton),
        new UIPropertyMetadata(null, OnCommandChanged));

    public ICommand Command
    {
        get
        {
            return (ICommand) GetValue(CommandProperty);
        }

        set
        {
            SetValue(CommandProperty, value);
        }
    }

    private static void OnCommandChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs eventArgs)
    {
        if (eventArgs.NewValue != eventArgs.OldValue)
        {
            var splitButton = dependencyObject as SplitButton;

            if (splitButton.button != null)
            {
                splitButton.button.Command = eventArgs.NewValue as ICommand;
            }
        }
    }

    private void OnArrowClick(object sender, RoutedEventArgs e)
    {
        var buttonMenu = ContextMenuService.GetContextMenu(this.button);

        if (this.menuItemsSource.Count > 0 && buttonMenu != null)
        {
            buttonMenu.IsOpen = !buttonMenu.IsOpen;
            buttonMenu.PlacementTarget = this.button;
            buttonMenu.Placement = PlacementMode.Bottom;
        }
    }

    private void SplitButton_OnLoaded(object sender, RoutedEventArgs e)
    {
        this.button = this.Template.FindName("mainButton", this) as Button;
        if (this.Command != null)
        {
            this.button.Command = this.Command;
        }
    }
}

使用中で:

<controls:SplitButton HorizontalAlignment="Left" VerticalAlignment="Top" Command="{Binding TestCommand}">
    <controls:SplitButton.MenuItemsSource>
        <MenuItem Header="ham" Command="{Binding TestCommand2}" />
        <MenuItem Header="sandwiches" />
        <MenuItem Header="yum" />
    </controls:SplitButton.MenuItemsSource>
    <TextBlock Padding="4" Text="Testing" />
</controls:SplitButton>

スプリットボタンの使用例

于 2012-12-16T20:56:01.827 に答える
1

2つの標準ボタンからいつでも独自のボタンを作成できますが、それほど難しくはありません。ボタン内のボタンだけで、内側のボタンのスタイルをカスタマイズして境界線をなくし、ドロップダウントライアングルを使用して、背景を「透明」にします(クリックスルーを引き起こす{x:null}背景と同じ)

大まかに次のようなものです。

<Button Style="outerStyle">
  <Button.Content>
     <StackPanel Orientation="Horizontal">
        <Label>Click Me</Label>
        <Button Style="{innerStyleWithTransparentBackground}"> ▼ </Button>
     </StackPanel>
  </Button.Content>
</Button>

多くの分割ボタンを使用する場合(とにかく実行する)、この構成をいくつかのルーティングされたイベントを使用してユーザーコントロールに配置できます。それ以外の場合は、他のコードにネストできます。

これは最も洗練されたソリューションではありませんが、おそらくあなたが見つける最も単純なソリューションの1つです。

于 2012-12-10T16:05:48.667 に答える
0

「親指の痛みのように突き出る」は、wpfコントロールがスタイルを解決する方法の結果です。デフォルトでは(Styleプロパティを介してスタイルを指定していない場合)、splitButtonは、TargetTypeがsplitButtonで、暗黙のスタイルx:Keyが "{x:Type SplitButton}のスタイルが見つかるまで、リソースツリーを上に移動します。 "。分割ボタンのスタイルが見つからない場合は、現在使用しているWindowsテーマのテーマファイルを検索します。win7では、これは通常Aero.NormalColor.xamlです。win8についてはよくわかりませんが、Metro.NormalColor.xamlを想像します(間違っている場合は修正してください)。テーマディクショナリでスタイルが見つからない場合は、Generic.xamlで検索されます。いずれかの方法、

例: http: //msdn.microsoft.com/en-us/library/ms745683.aspx#styling_basics

于 2012-12-09T03:58:48.320 に答える