首页 > 解决方案 > 自定义控件不显示

问题描述

我正在尝试学习如何设计 Wpf .NET Core 自定义控件。我一直在关注 YouTube 视频,但是在运行解决方案时,控件没有显示在主窗口上。谁能看到我做错了什么?

主窗口.xaml

<Window x:Class="AnalogClock.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:AnalogClock"
        xmlns:custom="clr-namespace:AnalogClock.CustomControls"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Label Content="Test"/>
        <StackPanel>
            <custom:AnalogClock/>
        </StackPanel>
    </Grid>
</Window>

/Themes/Generic.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:local="clr-namespace:AnalogClock.Themes">
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="/CustomControls/AnalogClockStyle.xaml"/>
    </ResourceDictionary.MergedDictionaries>

</ResourceDictionary>

/CustomControls/AnalogClock.cs

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Windows.Controls;

namespace AnalogClock.CustomControls
{
    class AnalogClock : Control
    {
        static AnalogClock()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(AnalogClock), new FrameworkPropertyMetadata(typeof(AnalogClock)));
        }
    }
}

/CustomControls/AnalogClockStyle.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    xmlns:local="clr-namespace:AnalogClock.CustomControls">
    <Style TargetType="local:AnalogClock">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="local:AnalogClock">
                    <Grid>
                        <Line x:Name="PART_HourHand"
                              Stroke="Black"
                              StrokeThickness="2"
                              VerticalAlignment="Center"
                              HorizontalAlignment="Center"
                              X1="0"
                              X2="-75"/>
                        <Line x:Name="PART_MinuteHand"
                              Stroke="Black"
                              StrokeThickness="2"
                              VerticalAlignment="Center"
                              HorizontalAlignment="Center"
                              X1="0"
                              X2="-100"/>
                        <Line x:Name="PART_SecondHand"
                              Stroke="Red"
                              StrokeThickness="2"
                              VerticalAlignment="Center"
                              HorizontalAlignment="Center"
                              X1="0"
                              X2="-100"/>
                        <Ellipse x:Name="PART_Border" 
                                 Stroke="Black"
                                 Fill="Black"
                                 StrokeThickness="2" 
                                 Width="210" 
                                 Height="210"/>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

标签: c#.netwpf.net-corecontrols

解决方案


将以下属性添加到项目中的任何类文件中,例如添加到AnalogClock定义类的文件中:

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

与 .NET Framework 项目不同,.NET Core 项目AssemblyInfo.cs默认不包含包含此属性的文件。需要找到通用资源字典。


推荐阅读