Связанное с данными меню с иконками - PullRequest
1 голос
/ 03 сентября 2011

У меня есть простая разметка, приведенная ниже. DataContext назначается во время выполнения.

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" MinHeight="5" />
        <RowDefinition Height="*" />
        <RowDefinition Height="Auto" MinHeight="5" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>

    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto" MinWidth="5" />
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="Auto" MinWidth="5" />
    </Grid.ColumnDefinitions>

    <Menu Name="GlobalMenu" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="3">
        <Menu.ItemContainerStyle>
            <Style TargetType="MenuItem" BasedOn="{StaticResource {x:Type MenuItem}}">
                <Setter Property="Header" Value="{Binding Text}" />
                <Setter Property="Icon">
                    <Setter.Value>
                        <Image Source="{Binding Image}" />
                    </Setter.Value>
                </Setter>
                <Setter Property="ItemsSource" Value="{Binding Children}" />
            </Style>
        </Menu.ItemContainerStyle>
    </Menu>
</Grid>

Проблема в том, что значки пунктов меню отображаются только в первый раз. Таким образом, пункты меню все еще существуют, текст есть, я могу изменить текст пункта меню, изменив связанный объект DataContext, поэтому связывание обычно работает, но значок не рисуется. Поскольку значки немного больше, я замечаю, что не только значок не рисуется, но и элемент меню уменьшается в размере, как будто значка вообще нет.

Свойство Icon на связанном объекте выглядит следующим образом

    public BitmapImage Image
    {
        get
        {
            byte[] image = _widget.CommandRelation.Command.Element.Image;

            if (image == null)
            {
                return null;
            }

            BitmapImage bitmapImage = new BitmapImage();

            using (MemoryStream stream = new MemoryStream(image))
            {
                bitmapImage.BeginInit();
                bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
                bitmapImage.StreamSource = stream;
                bitmapImage.EndInit();
            }

            return bitmapImage;
        }
    }

1 Ответ

3 голосов
/ 03 сентября 2011

Если вы создаете объекты в Style, то для всех объектов, использующих стиль, создается только один экземпляр, этого не произойдет, поскольку элементы пользовательского интерфейса нельзя использовать более чем в одном месте.

Вы можете поместить объявление Image в некоторый (скомпилированный) словарь ресурсов, который доступен из того места, где используется Style (Style.Resources не скомпилированы, так что, к сожалению, не будет работать) и установить x:Shared для него false, поэтому, когда вы ссылаетесь на него в Setter.Value через StaticResource, каждый раз создается новый экземпляр, и каждый MenuItem получает свой собственный значок.

например. попробуйте это:

<Menu Name="GlobalMenu" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="3">
    <Menu.Resources>
        <Image x:Key="Icon" x:Shared="False" Source="{Binding Image}" />
    </Menu.Resources>
    <Menu.ItemContainerStyle>
        <Style TargetType="MenuItem" BasedOn="{StaticResource {x:Type MenuItem}}">
            <Setter Property="Header" Value="{Binding Text}" />
            <Setter Property="Icon" Value="{StaticResource Icon}"/>
            <Setter Property="ItemsSource" Value="{Binding Children}" />
        </Style>
    </Menu.ItemContainerStyle>
</Menu>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...