Как заставить панель инструментов WPF привязываться к коллекции на моей виртуальной машине без использования расширителя

У меня есть окно WPF с расширением ToolBar. У меня есть коллекция объектов на моей виртуальной машине, к которой я привязываюсь. Они отображаются как кнопки, но всегда помещаются в расширенную раскрывающуюся часть 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>

У меня есть следующий С#:

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"},
                       };

        }
    }

Это визуальный результат:

альтернативный текст


person Rick Kierner    schedule 19.10.2009    source источник
comment
Если я дам панели инструментов статическую ширину 500, произойдет тот же визуальный результат.   -  person Rick Kierner    schedule 19.10.2009
comment
Не могли бы вы быть более конкретным   -  person Shimmy Weitzhandler    schedule 19.10.2009
comment
@ Шимми, я не думаю, что смогу быть более конкретным, но я попытаюсь. Я хочу, чтобы те кнопки, которые у меня есть на панели инструментов, отображались в стандартной (не переполненной) части панели инструментов.   -  person Rick Kierner    schedule 19.10.2009


Ответы (4)


В панели инструментов есть ошибка, если изменить размер окна, проблема уходит.

Решение использует другой элемент управления, например:

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

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

Просмотрите эту тему для получения дополнительной информации

person Eduardo Molteni    schedule 19.10.2009
comment
К сожалению, это не сработало. Однако вы правы, когда я изменяю размер экрана, кнопки отображаются так, как ожидалось. - person Rick Kierner; 19.10.2009
comment
Это решение не сработало напрямую для меня. Однако я не проверял предоставленный вами образец. - person Oskar; 20.10.2009
comment
Извини, Эдуардо, мой плохой. Это решение работает. Я тоже забыл заменить <ToolBar.ItemTemplate... на <WorkaroundToolBar.ItemTemp.... - person Oskar; 22.10.2009
comment
К сожалению, это не работает полностью. Если коллекция кнопок сначала пуста, приложение запускается, а некоторые кнопки добавляются динамически с помощью кода, а затем панель инструментов (Временное решение) по-прежнему визуально недействительна. Он выглядит точно так же, как на скриншоте выше, и правильно перерисовывается, как только размер окна изменяется. Есть еще подсказки? - person Buthrakaur; 05.03.2010
comment
@Buthrankaur: не тестировалось, но я думаю, что вы можете снова вызвать IvalidateMeasureJob при добавлении кнопок. - person Eduardo Molteni; 05.03.2010

Вы также можете установить высоту панели инструментов в xaml на разумное значение, которое сработало для меня.

person Recep    schedule 18.01.2010

Чтобы добавить к Eduardo, мне пришлось немного изменить это, так как мой источник элементов заполнялся асинхронно, через некоторое время после отображения исходного пользовательского интерфейса:

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);
    }
}

Этого было достаточно, чтобы уловить все крайние случаи и обеспечить правильное переполнение по мере необходимости после заполнения элементов.

person Pete    schedule 02.11.2015

Установите «ToolBar.OverflowMode = Никогда».

Дополнительную информацию о переполнении панели инструментов можно найти здесь.

person Samuel    schedule 13.07.2020
comment
Вы должны быть более уверены в своем ответе. - person Puspam; 13.07.2020