5

を持つWPFウィンドウがありToolBarます。VM にバインドしているオブジェクトのコレクションがあります。これらはボタンとして表示されますが、常に の展開されたドロップダウン部分にプッシュされますToolBar。これらのボタンを の標準部分に表示するにはどうすればよいToolBarですか?

次の XAML があります。

<ToolBarTray Grid.Row="1">
    <ToolBar ItemsSource="{Binding Path=MyList}" >
        <ToolBar.ItemTemplate>
            <DataTemplate  >
                <Button ToolTip="{Binding ButtonName}" 
                        Command="{Binding Path=ButtonCommand}" >
                    <Button.Content>
                        <Image Width="32" Height="32" Source="{Binding ImageSource}"/>
                    </Button.Content>
                </Button>
            </DataTemplate>
        </ToolBar.ItemTemplate>
    </ToolBar>
</ToolBarTray>

私は次のC#を持っています:

public List<MyClass> MyList
    {
        get
        {
            return new List<MyClass>
                       {
                           new MyClass{ButtonName="Button1",ImageSource=@"C:\Projects\WpfApplication2\WpfApplication2\Employee.png"},
                           new MyClass{ButtonName="Button2",ImageSource=@"C:\Projects\WpfApplication2\WpfApplication2\Employee.png"},
                           new MyClass{ButtonName="Button3",ImageSource=@"C:\Projects\WpfApplication2\WpfApplication2\Employee.png"},
                           new MyClass{ButtonName="Button4",ImageSource=@"C:\Projects\WpfApplication2\WpfApplication2\Employee.png"},
                       };

        }
    }

これは視覚的な結果です:

代替テキスト

4

4 に答える 4

4

ツールバーにバグがあります。ウィンドウのサイズを変更すると、問題は解決します。

ソリューションは、次のような別のコントロールを使用しています。

public class WorkaroundToolBar : ToolBar
{
    private delegate void IvalidateMeasureJob();

    public override void OnApplyTemplate()
    {
        Dispatcher.BeginInvoke(new IvalidateMeasureJob(InvalidateMeasure), 
                                     DispatcherPriority.Background, null);
        base.OnApplyTemplate();
    }
}

詳細については、このスレッドを確認してください

于 2009-10-19T18:40:02.263 に答える
1

xaml のツールバーの高さを妥当な値に設定することもできます。

于 2010-01-18T10:39:39.260 に答える
1

Eduardo に追加するには、最初の UI が表示されてからしばらくしてからアイテム ソースが非同期的に入力されていたため、これを微調整する必要がありました。

public class ToolBar : System.Windows.Controls.ToolBar
{
    public override void OnApplyTemplate ()
    {
        Dispatcher.BeginInvoke ((Action)(InvalidateMeasure), DispatcherPriority.Background, null);
        base.OnApplyTemplate ();
    }
    protected override void OnItemsChanged (NotifyCollectionChangedEventArgs e)
    {
        base.OnItemsChanged (e);
        Dispatcher.BeginInvoke ((Action)(InvalidateMeasure), DispatcherPriority.Background, null);
    }
}

これは、すべてのエッジ ケースをキャッチし、アイテムの作成後に必要に応じてオーバーフローを適切に発生させるのに十分でした。

于 2015-11-02T17:45:02.393 に答える