SplitButton
で機能する商用グレードのWPFToolBar
コントロールを探して、非常にイライラする午後をGoogleでトロールしました。 SplitButton
は、Button
の主要部分をクリックしてデフォルトのアクションを実行するか、右側の小さな三角形をクリックして代替アクションのドロップダウンメニューを表示できるものです。 )。
私はウェブ上でいくつかを見つけました(CodeProject上のものとCodePlex上の2つを含む)。 ToolBar
で正しく機能するものはありません。まったく表示されないか、ツールバーボタンのスタイルがありません。 ActiProのポップアップボタン(SharedLibrary DLL内)など、いくつかの商用製品も調べました。同じ問題。
そして、はい、私はそれを作成することがいかに簡単であるかについてのすべての投稿を見てきました。悪いものを作成するのは非常に簡単ですが、マウスボタンを離してもドロップダウンメニューが消えないOutlookまたはVisualStudioのSplitButton
sのように見えるものを作成するのはそれほど簡単ではありません。
だから、ここに私の質問があります:ツールバーで動作する、オープンソースまたは商用の商用グレードのSplitButton
sはありますか?誰かのコントロールライブラリへの年間サブスクリプション$ 1,500の一部であるコントロールを探していませんが、手頃な価格のSplitButton
があれば、きっと見つけたいと思います。
私が知っている唯一の真の「商用グレード」の分割ボタンは、 Syncfusion によるものです。これは、リボンコントロールの一部として含まれています(リボンの外側でも機能します)。
そうは言っても、無料のものを探しているなら、 この実装 はかなり使いやすく完全であると覚えています。
それをすべて持っているように見える別の良い無料の実装:
http://huydinhpham.blogspot.com/2008/09/wpf-drop-down-and-split-button.html
Extended WPF Toolkit Community Edition (無料)にはNice SplitButton
があります(また、DropDownButton
もあります)
<xctk:SplitButton Content="Click Me">
<xctk:SplitButton.DropDownContent>
<xctk:ColorCanvas />
</xctk:SplitButton.DropDownContent>
</xctk:SplitButton>
WPFとSilverlightover Delayのブログには、かなり優れた分割ボタンの実装があります。
Banana SplitButton(SplitButtonのWPF固有の修正、およびSilverlightバージョンのコード分析の改善もあります)
分割ボタンで何を探しているのか正確にはわかりませんが、分割ボタンの作成方法に関するこのビデオはかなり完成しており、ほぼ完璧な分割ボタンを作成します。
http://windowsclient.net/learn/video.aspx?v=3929
チュートリアルが必要ないことは知っていますが、これは以前に使用したことがあり、Outlookのものとの違いがわかりませんでした。
私はあなたが意味することはDropDownButtonと呼ばれていると思います。 MenuItem "StaysOpenOnClick"には、問題を解決できるブールプロパティがあります。
私は同じものを探していて、自分でロールしました((ツールバーに一致するように)好みに合わせてスタイルを設定する必要があり、リファクタリング/カスタムコントロールに変換できます...など)
<StackPanel x:Name="Split" Orientation="Horizontal">
<Button Command="{Binding MainCommand}">
<StackPanel>
<Image Source="{StaticResource MainCommandImage}"/>
<TextBlock>MainCommand</TextBlock>
</StackPanel>
</Button>
<Separator HorizontalAlignment="Left" Width="1" VerticalAlignment="Stretch" Margin="0,5"/>
<CheckBox Width="16" IsThreeState="False">
<Grid>
<Path Fill="Black" Data="{StaticResource DownArrowGeometry}"
Stretch="Uniform" Height="6" Width="6" HorizontalAlignment="Center" VerticalAlignment="Center"/>
<Popup x:Name="popupOptions" AllowsTransparency="True" PopupAnimation="Fade" StaysOpen="False"
Placement="Bottom" PlacementTarget="{Binding ElementName=Split}" HorizontalOffset="-3"
IsOpen="{Binding RelativeSource={RelativeSource AncestorType={x:Type CheckBox}, AncestorLevel=1}, Path=IsChecked}">
<StackPanel>
<StackPanel>
<Image Source="{StaticResource SubCommandImage1}"/>
<TextBlock>SubCommand1</TextBlock>
</StackPanel>
<StackPanel>
<Image Source="{StaticResource SubCommandImage2}"/>
<TextBlock>SubCommand2</TextBlock>
</StackPanel>
</StackPanel>
</Popup>
</Grid>
</CheckBox>
</StackPanel>
WPFツールキットの分割ボタンを使用してコンテキストメニューを表示するのは、かなり簡単です。ウィンドウリソースにコンテキストメニューを追加します。ウィンドウの読み込み時に-コンテキストメニューを分割ボタンにバインドしてから、通常どおりにコンテキストメニューを使用します。
このボタンの主な使用例は古いWinFormSplittボタンを複製することであるため、これをWPFツールキットに追加する必要があります。
<Window x:Class="SplitButtonTesting.MainWindow"
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"
xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<ContextMenu x:Key="contextMenu" IsOpen="{Binding IsOpen}">
<MenuItem Header="One" />
<MenuItem Header="Two" />
<MenuItem Header="More...">
<MenuItem Header="One" />
<MenuItem Header="Two" />
</MenuItem>
</ContextMenu>
</Window.Resources>
<DockPanel>
<Menu DockPanel.Dock="Top" x:Name="ApplicationMenu">
<xctk:SplitButton x:Name="SplitButton" Content="Main Button" DropDownContent="{x:Null}" />
</Menu>
<Border />
</DockPanel>
背後にあるコード:
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
namespace SplitButtonTesting
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
SetupSplitButton();
}
public void SetupSplitButton()
{
var menu = this.Resources["contextMenu"] as ContextMenu;
menu.PlacementTarget = SplitButton;
menu.Placement = PlacementMode.Bottom;
menu.DataContext = SplitButton;
}
}
}