私は2つのアプローチを行っています。 1つはネストされた要素で、もう1つは単純なComboBoxで作成されます。ボタンはComboBox
とRibbonGalleryCategory
XAML
<StackPanel>
<Button Content="Fill me :)" Width="80" Height="20" Click="FillMe_OnClick"/>
<Ribbon>
<RibbonGroup Header="Category">
<RibbonComboBox Name="cboCategory" Label="Category" HorizontalContentAlignment="Left">
<ComboBoxItem>Item 1</ComboBoxItem>
<ComboBoxItem>Item 2</ComboBoxItem>
<ComboBoxItem>Item 3</ComboBoxItem>
<ComboBoxItem>Item 4</ComboBoxItem>
</RibbonComboBox>
<RibbonComboBox Name="cboSubcategory" Label="Subcategory:" HorizontalContentAlignment="Left">
<RibbonGallery Name="galSubcategory">
<RibbonGalleryCategory Name="catSubcategory" DisplayMemberPath="Text">
</RibbonGalleryCategory>
</RibbonGallery>
</RibbonComboBox>
</RibbonGroup>
</Ribbon>
<Button Content="Read me" Width="80" Height="20" Click="ReadMeCat_OnClick"></Button>
<Button Content="Read me too" Width="80" Height="20" Click="ReadMeCombo_OnClick"></Button>
</StackPanel>
分離コード
public MainWindow()
{
InitializeComponent();
}
private void FillMe_OnClick(object sender, RoutedEventArgs e)
{
this.catSubcategory.Items.Add(new { Text = "Hello" });
this.catSubcategory.Items.Add(new { Text = "World" });
this.catSubcategory.Items.Add(new { Text = "Hello" });
this.catSubcategory.Items.Add(new { Text = "Moon" });
}
private void ReadMeCat_OnClick(object sender, RoutedEventArgs e)
{
var result = catSubcategory.Items.Cast<dynamic>().Aggregate("", (current, xx) => (string) (current + (xx.Text + "\n")));
MessageBox.Show(result);
}
private void ReadMeCombo_OnClick(object sender, RoutedEventArgs e)
{
var result = cboCategory.Items.Cast<ComboBoxItem>().Aggregate("", (current, xx) => current + (xx.Content.ToString() + "\n"));
MessageBox.Show(result);
}
私はこのdoesntのは、ムーが必要だと思うNOTE
を記入し、読みch説明。それでも必要な場合は、電話してください;)
これは実行する方法ではありません。 WPFはBindingsとMVVMを使って真のパワーを発揮します。私はあなたにもそのような例を提供することができます。
EDIT
はいあなたが正しいです。 ComboBox-Itemsは表示されますが、RibbonGalleryCategory
- 接続を使用しない限り選択できません。
この資料についての別の愚かなことは、そのRibbonGallery
は実際には実際のではありません。そのControlTemplateを持つItemsControlは、VisualTreeHelper
が見つかりません。
私の意見では、MVVMとDataBindingを最初から使用しないと、そのコントロールを使用するとすべてが複雑になります。
DataBindingではすべてが魅力的です。残念ながら、まだRibbonGallery
とRibbonGalleryCategory
を使用する必要があります。それとも、場所が単にリボンスタイルの共通のComboBox
EDIT 2 - シンプルなMVVM-アプローチ
コード
public partial class MainWindow : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public MainWindow()
{
InitializeComponent();
this.Ponies.Add(new Pony() { Id = 0, Color = Brushes.DeepSkyBlue, Name = "Slayer" });
this.Ponies.Add(new Pony() { Id = 1, Color = Brushes.DeepPink, Name = "Murder" });
this.Ponies.Add(new Pony() { Id = 2, Color = Brushes.Yellow, Name = "Brutal" });
this.DataContext = this;
}
private ObservableCollection<Pony> _ponies = new ObservableCollection<Pony>();
private Pony _selectedPony;
public ObservableCollection<Pony> Ponies => this._ponies;
public Pony SelectedPony {
get { return _selectedPony; }
set {
if (this._selectedPony == value) return;
_selectedPony = value;
this.OnPropertyChanged("SelectedPony");
}
}
}
public class Pony : INotifyPropertyChanged
{
public int Id { get; set; }
private string _name;
public string Name {
get { return this._name; }
set {
this._name = value;
this.OnPropertyChanged("Name");
}
}
public Brush Color { get; set; }
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
XAML
<Window x:Class="MyNameSpace.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"
x:Name="root"
Title="Try WPF!"
mc:Ignorable="d">
<Grid >
<Grid.RowDefinitions>
<RowDefinition Height="Auto"></RowDefinition>
<RowDefinition></RowDefinition>
</Grid.RowDefinitions>
<Ribbon>
<RibbonGroup Header="Category">
<RibbonComboBox Label="Category" HorizontalContentAlignment="Left" >
<RibbonGallery SelectedItem="{Binding SelectedPony}">
<RibbonGalleryCategory ItemsSource="{Binding Ponies}" >
<RibbonGalleryCategory.ItemTemplate>
<DataTemplate>
<TextBlock Name="tb" Text="{Binding Name}" Background="{Binding Color}"/>
</DataTemplate>
</RibbonGalleryCategory.ItemTemplate>
</RibbonGalleryCategory>
</RibbonGallery>
</RibbonComboBox>
</RibbonGroup>
</Ribbon>
</Grid>
</Window>
として、結果として、より多くの電力、少ないコードを参照してください:)
MVVMアプローチまたはコードビハインドが必要ですか? – lokusking
@ lokusking:今のところ、私はコードから要素を見つけようとしています。 –