c# - 自定义控件不显示

标签 c# .net wpf .net-core controls

我正在尝试学习如何设计 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>

最佳答案

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

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

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

关于c# - 自定义控件不显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59177573/

相关文章:

c# - 依赖 DLL 未被复制到 Visual Studio 中的构建输出文件夹

c# - 如何使用 .NET 枚举属于特定进程的所有窗口?

c# - 垃圾收集器在收集可访问对象的实例属性或字段时的行为不明确

c# - 为什么 client.GetUserDialogsAsync() 抛出错误无法读取 TLSharp 中的数据包长度

c# - 显示hadoop内容C#

.net - 从嵌入的 YouTube 视频中删除品牌和标题链接

c# - 我如何在 Glyphs 中实现字符连字?

c# - 将 ComboBox 插入动态表

c# - 在 wpf 中制作 StackPanel 及其内容 "draggable"?

c# - Azure Blob 存储 : How to enumerate blobs in long-running and recoverable fashion?