Visual Studioの元に戻すやり直しボタンを模倣するために、RibbonSplitButtonをドロップダウンのメニュー項目に使用しています。元に戻すとやり直しのスタックがあり、スタックに基づいて UI を更新する dependencypropertychanged イベント ハンドラーがあります。問題は、splitbutton の items プロパティが Collection を使用していて、アイテムのコレクションが正しい順序になっているにもかかわらず、インデックス順に並べられているため表示されないことです。
これをよりよく説明するために、以下にいくつかの例を示します。
コード:
private static void UndoRedoUpdated(DependencyObject obj, DependencyPropertyChangedEventArgs args)
{
VO3Main main = (VO3Main)Application.Current.MainWindow;
MenuItem item;
int dif;
if (main.UndoCommands != null)
{
dif = main.UndoCommands.Count - main._undoMenu.Items.Count;
if (dif > 0)
{
for (int i = dif - 1; i >= 0; i--)
{
item = new MenuItem();
item.Header = main.UndoCommands[i].Name;
item.Click += new RoutedEventHandler(main.undoMenu_Click);
main._undoMenu.Items.Insert(0, item);
}
}
else if (dif < 0)
{
for (int i = 0; i < -dif; i++)
main._undoMenu.Items.RemoveAt(0);
}
}
if (main.RedoCommands != null)
{
dif = main.RedoCommands.Count - main._redoMenu.Items.Count;
if (dif > 0)
{
for (int i = dif - 1; i >= 0; i--)
{
item = new MenuItem();
item.Header = main.RedoCommands[i].Name;
item.Click += new RoutedEventHandler(main.redoMenu_Click);
main._redoMenu.Items.Insert(0, item);
}
}
else if (dif < 0)
{
for (int i = 0; i < -dif; i++)
main._redoMenu.Items.RemoveAt(0);
}
}
}
XAML:
<r:RibbonGroup GroupSizeDefinitions="{StaticResource RibbonLayoutSmall}">
<r:RibbonGroup.Command>
<r:RibbonCommand LabelTitle="Editing"/>
</r:RibbonGroup.Command>
<r:RibbonSplitButton Name="_undoMenu" Command="me:AppCommands.Undo" MaxHeight="50"/>
<r:RibbonSplitButton Name="_redoMenu" Command="me:AppCommands.Redo" MaxHeight="50"/>
</r:RibbonGroup>
PS 0 の挿入を Add に変更しても、コレクションの最初ではなく最後に追加されますが、違いはないようです...何が起こっているのかについて誰かが私に情報を与えることができればこれを回避する方法については、非常に高く評価されます。前もって感謝します。