Наследование и ограничения - PullRequest
0 голосов
/ 08 марта 2012

Мне нужен элемент управления, как Label в WPF.Но этот ярлык всегда должен иметь автоматический размер
(ширина = высота = авто) - пользователь не должен иметь возможность его изменять.

Также BorderThinkness всегда должен быть = 0.

Как можноЯ делаю это в WPF?Можно ли наследовать такую ​​метку, чтобы потомки сохранили это свойство (всегда AutoSized)?

Ответы [ 3 ]

1 голос
/ 09 марта 2012

И установщики ширины, и высоты в конечном итоге применяют модификацию границ, вызывая виртуальный метод SetBoundsCore. Переопределение этого метода, вероятно, должно стать вашим первым подходящим вариантом для предлагаемой модификации.

0 голосов
/ 09 марта 2012

Рассматривали ли вы наличие словаря ресурсов для всего приложения и определения стиля? Определите его один раз, и вы можете использовать <Label Style="{StaticResource ResourceKey=AutoSizeLabel}" /> там, где вам это нужно.

В AppResources.xaml:

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:System="clr-namespace:System;assembly=mscorlib"
    >
    <Style x:Key="AutoSizeLabel" TargetType="{x:Type Label}">
        <Setter Property="Width" Value="Auto" />
        <Setter Property="Height" Value="Auto" />
        <Setter Property="BorderThickness" Value="0" />
    </Style>
</ResourceDictionary>

In App.xaml

    <Application.Resources>
        <ResourceDictionary Source="AppResources.xaml" />
    </Application.Resources>

В MainWindow.xaml

<Grid>
    <Label Style="{StaticResource ResourceKey=AutoSizeLabel}">MyLabel</Label>
</Grid>
0 голосов
/ 08 марта 2012

Создайте UserControl, который оборачивает метку и жесткие коды
Width = Height = Auto
и
BorderThickness = 0.

Что-то вроде:

<UserControl ...>
   <Label Width="Auto" Height="Auto" BorderThickness="0" />
</UserControl>

Конечно, вам нужно будет выставить другие свойства через свойства зависимостей.

РЕДАКТИРОВАТЬ: (выстрел в темноте)

Вы можете попробовать это:

public class NewLabel : Label
    {
        private readonly object m_AutoValue;

        public NewLabel()
        {
            m_AutoValue = base.GetValue(NewLabel.HeightProperty);

            NewLabel.HeightProperty.OverrideMetadata(typeof(NewLabel), new PropertyMetadata(
                new PropertyChangedCallback(
                    (dpo, dpce) =>
                    {
                        if (!dpce.NewValue.Equals(m_AutoValue))
                        {
                            ((NewLabel)dpo).ClearValue(Label.HeightProperty);
                        }
                    })));
        }
    }

Я только что придумал, так что, возможно, понадобится отладка, но вы поняли;)

...