Пользовательские элементы управления WPF невидимы - PullRequest
5 голосов
/ 14 июля 2011

Когда я создаю пользовательский элемент управления в WPF и добавляю его в окно, я ничего не вижу там, где я поместил его в диалоге. Вот что я делаю:

  1. Создание нового приложения WPF
  2. Добавить -> Новый элемент ... -> Пользовательский элемент управления (WPF): "CustomButton.cs"
  3. Я изменяю базовый класс CustomButton на Button вместо Control
  4. Добавить элемент управления CustomButton в главное окно.
  5. Когда я запускаю приложение или просматриваю главное окно в конструкторе, я ничего не вижу.

Вот как выглядит код.

CustomButton.cs:

public class CustomButton : Button
{
    static CustomButton()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomButton),
            new FrameworkPropertyMetadata(typeof(CustomButton)));
    }
}

MainWindow.xaml:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" xmlns:my="clr-namespace:WpfApplication1">
    <Grid>
        <my:CustomButton Content="Hello World" x:Name="customButton1"
                         HorizontalAlignment="Left" VerticalAlignment="Top" Margin="150,175,0,0" />
    </Grid>
</Window>

Generic.xaml:

<Style TargetType="{x:Type local:CustomButton}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:CustomButton}">
                <Border Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Я нашел два следа того, что происходит, но пока ничего не щелкнуло. Когда я добавил пользовательский элемент управления, Visual Studio добавил Themes / Generic.xaml, но независимо от того, что я там пробую, я не вижу разницы на экране. Другое дело, что если я закомментирую статический конструктор в CustomButton.cs, кнопка внезапно появится в главном окне. Хотя это выглядит не совсем правильно во всех ситуациях (например, если я использую кнопку на панели инструментов).

Ответы [ 2 ]

10 голосов
/ 14 июля 2011

Где ваш пользовательский шаблон управления?

Говоря

      DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomButton),
        new FrameworkPropertyMetadata(typeof(CustomButton)));

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

8 голосов
/ 09 ноября 2015

Полагаю, вы тем временем нашли решение своей проблемы. Однако, для случая, кто-то еще сталкивается с той же проблемой, что и вы: Вероятно, единственное объяснение того, почему пользовательский элемент управления не отображается, хотя все шаги по его созданию были выполнены правильно, как и вы, - это отсутствующая запись в AssemblyInfo.cs. Этот файл должен содержать следующую запись:

[assembly: ThemeInfo(ResourceDictionaryLocation.None, ResourceDictionaryLocation.SourceAssembly))]

Без этой записи файл generic.xaml игнорируется, и поэтому шаблон элемента управления по умолчанию не найден, поэтому элемент управления вообще не получит шаблон элемента управления и, следовательно, не будет отображаться. Это также объясняет, почему ваш элемент управления неожиданно появился, когда вы отключили его статический конструктор. Линия:

DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomButton), new FrameworkPropertyMetadata(typeof(CustomButton)));

говорит элементу управления использовать свой собственный стиль по умолчанию вместо того, чтобы наследовать его от своего базового класса. Таким образом, без этой строки CustomButton просто повторно использует шаблон элемента управления по умолчанию класса Button, в результате чего ничто из того, что вы записываете в generic.xaml, не будет иметь никакого эффекта для CustomButton.

...