Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 开始使用派生的自定义控件?_Wpf_Custom Controls - Fatal编程技术网

Wpf 开始使用派生的自定义控件?

Wpf 开始使用派生的自定义控件?,wpf,custom-controls,Wpf,Custom Controls,我正在试验派生自定义控件,并创建了我认为最简单的派生: 我在VS2010中创建了一个自定义控件项目,并将CustomControl1的基类从control更改为Calendar 然后我进入Generic.xaml并删除了为CustomControl1创建的默认样式 最后,我创建了一个WPF应用程序来使用该控件 当我将自定义控件添加到应用程序的主窗口时,我希望看到一个常规的WPF日历,因为我是从日历派生的,并且没有对日历控件模板进行任何更改 相反,在设计时或运行时不会显示任何内容。主窗口仍然是空的

我正在试验派生自定义控件,并创建了我认为最简单的派生:

我在VS2010中创建了一个自定义控件项目,并将CustomControl1的基类从control更改为Calendar

然后我进入Generic.xaml并删除了为CustomControl1创建的默认样式

最后,我创建了一个WPF应用程序来使用该控件

当我将自定义控件添加到应用程序的主窗口时,我希望看到一个常规的WPF日历,因为我是从日历派生的,并且没有对日历控件模板进行任何更改

相反,在设计时或运行时不会显示任何内容。主窗口仍然是空的。我不确定到底发生了什么,但很明显,我在这条路线的某个地方做出了错误的假设

有人能帮我澄清一下吗?谢谢你的帮助

顺便问一下,我为什么要这样做?我正在扩展Calendar控件,但只需要修改CalendarDayButton控件模板。在进行修改之前,我想我应该能够首先显示未修改的日历。就像我说的,我想我在某处做了一个错误的假设

CustomControl1.cs 以下是CustomControl1的代码:

using System.Windows;
using System.Windows.Controls;

namespace WpfCustomControlLibrary1
{
     public class CustomControl1 : Calendar
     {
          static CustomControl1()
          {
               DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControl1), new FrameworkPropertyMetadata(typeof(CustomControl1)));
          }
     }
}
Generic.xaml 以下是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:WpfCustomControlLibrary1">


</ResourceDictionary>
主窗口 最后,这里是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" 

        xmlns:WpfCustomControlLibrary1="clr-namespace:WpfCustomControlLibrary1;assembly=WpfCustomControlLibrary1" Title="MainWindow" Height="350" Width="525">
    <Grid>
        <WpfCustomControlLibrary1:CustomControl1 />
    </Grid>
</Window>

WpfApplication1包含对WpfCustomControlLibrary1项目的引用。

DefaultStyleKeyProperty.OverrideMetataTypeOfcustomControl1,new FrameworkPropertyMetadatatypeofCustomControl1

->这一行的意思是CustomControl1在Generic.xaml中定义了它的默认样式

然后我进入Generic.xaml并删除了为CustomControl1创建的默认样式

->这将删除CustomControl1的默认样式

所以你的控件没有样式,所以它什么也不显示:D

与其从generic.xaml中删除样式,不如将日历控件的样式复制并将TargetType更改为CustomControl1,或者创建新样式并在日历上添加BasedOn

编辑,为下面David的答案添加更多信息,让人们可以看看下面的答案

<Style TargetType="{x:Type local:FsCalendar}" BasedOn={x:Type Calender}>
    <Setter Property="CalendarDayButtonStyle" Value="{StaticResource FsCalendarDayButtonStyle}" />
</Style>

这就是你所需要的款式。BasedOn将负责复制默认样式的所有内容,还将负责不同的主题。如果从日历的默认主题复制样式,则除了从中复制“默认”样式的主题外,您将中断所有主题的外观。

DefaultStyleKeyProperty.OverrideMetataTypeOfCustomomControl1,new FrameworkPropertyMetadataTypeOfCustomomControl1

->这一行的意思是CustomControl1在Generic.xaml中定义了它的默认样式

然后我进入Generic.xaml并删除了为CustomControl1创建的默认样式

->这将删除CustomControl1的默认样式

所以你的控件没有样式,所以它什么也不显示:D

与其从generic.xaml中删除样式,不如将日历控件的样式复制并将TargetType更改为CustomControl1,或者创建新样式并在日历上添加BasedOn

编辑,为下面David的答案添加更多信息,让人们可以看看下面的答案

<Style TargetType="{x:Type local:FsCalendar}" BasedOn={x:Type Calender}>
    <Setter Property="CalendarDayButtonStyle" Value="{StaticResource FsCalendarDayButtonStyle}" />
</Style>

这就是你所需要的款式。BasedOn将负责复制默认样式的所有内容,还将负责不同的主题。如果您从日历的默认主题复制样式,您将破坏所有主题的外观,但复制“默认”样式的主题除外。

感谢NVM的帮助,我找到了我的答案!这通常适用于控件,但特别适用于日历控件。如果只修改控件的一部分,则不必包含所有组成控件模板

但是,您必须包含主控件模板(指向自定义控件),并且必须建立从主控件到要修改的模板的链。对于我的日历控件,我只需要修改CalendarDayButton模板来实现我想要进行的更改。下面是我所做的:

我包含了主日历模板,并将其指向我的自定义控件

然后,为了深入了解CalendarDayButton,我添加了一个属性设置器,将我的主日历样式的CalendarDayButtonStyle属性指向我的自定义CalendarDayButton样式

下面是我的Generic.xaml文件中的主日历样式声明的最终外观:

<!-- Calendar Style -->
<Style TargetType="{x:Type local:FsCalendar}">
    <Setter Property="CalendarDayButtonStyle" Value="{StaticResource FsCalendarDayButtonStyle}" />
...
</Style>
主日历样式的其余部分保持不变,它是默认样式的副本

顺便说一句,CalendarDayButton样式定义必须出现在Generic.xaml中的主日历样式定义之前,否则主日历样式将无法找到它

我写了一篇代码项目文章,题目是。它穿过台阶
涉及扩展像WPF日历这样的复杂控件。希望它能帮助其他正在解决同样问题的人。

我找到了答案,感谢NVM的帮助!这通常适用于控件,但特别适用于日历控件。如果只修改控件的一部分,则不必包含所有组成控件模板

但是,您必须包含主控件模板(指向自定义控件),并且必须建立从主控件到要修改的模板的链。对于我的日历控件,我只需要修改CalendarDayButton模板来实现我想要进行的更改。下面是我所做的:

我包含了主日历模板,并将其指向我的自定义控件

然后,为了深入了解CalendarDayButton,我添加了一个属性设置器,将我的主日历样式的CalendarDayButtonStyle属性指向我的自定义CalendarDayButton样式

下面是我的Generic.xaml文件中的主日历样式声明的最终外观:

<!-- Calendar Style -->
<Style TargetType="{x:Type local:FsCalendar}">
    <Setter Property="CalendarDayButtonStyle" Value="{StaticResource FsCalendarDayButtonStyle}" />
...
</Style>
主日历样式的其余部分保持不变,它是默认样式的副本

顺便说一句,CalendarDayButton样式定义必须出现在Generic.xaml中的主日历样式定义之前,否则主日历样式将无法找到它


我写了一篇代码项目文章,题目是。它将完成扩展复杂控件(如WPF日历)所涉及的步骤。希望它能帮助解决同样问题的其他人。

顺便说一句,我发现了Style.BasedOn属性,它允许您从现有样式派生样式,而不必重复基本样式。还有一个。

顺便说一句,我后来发现了Style.BasedOn属性,它允许您从现有样式派生样式,而无需重复基本样式。有一个。

由,我实际上从您删除的问题下载了FSCalender项目,虽然我没有VS2010,但我确实在设计器中看到了控件,因此您的控件是正确的,可能是正确构建它的问题。谢谢-我删除了前面的问题,因为它非常长且复杂。这是一个简单得多的版本。到那时,我实际上下载了你删除的问题中的FSCalendar项目,虽然我没有VS2010,但我确实在设计器中看到了控件,因此你所看到的是正确的,这可能是正确构建它的问题。谢谢——我删除了前面的问题,因为它相当长而且复杂。这是一个简单得多的版本。感谢日历仍然没有出现。如果仅修改CalendarDayButton,是否必须在Generic.xaml中包含所有日历控件临时表?Michael Detras在EggheadCafe上的自定义控件似乎只包含他修改的控件模板。哎呀,再看一眼,Detras包含了所有模板。我想我有我的答案。我认为最好只是创建一个空样式,并在日历上添加BasedOn。这样,即使当前操作系统主题改变了所有其他控件的外观,您也不会被日历的相同外观所困扰。只有在实际需要更改控件的完全不同的布局时,才应以新样式更改ControlTemplate。如果您确实更改了样式中的ControlTemplate,请记住,在我看来,最佳做法是您拥有应用程序支持的所有主题的样式,至少阅读WPFSomes附带的主题,这只是一项大量工作,所以我要做的是删除硬编码颜色等样式中的所有内容,只保留这些内容其中我可以参考一些标准颜色等。。希望这个帮助汉克日历还没有出现。如果仅修改CalendarDayButton,是否必须在Generic.xaml中包含所有日历控件临时表?Michael Detras在EggheadCafe上的自定义控件似乎只包含他修改的控件模板。哎呀,再看一眼,Detras包含了所有模板。我想我有我的答案。我认为最好只是创建一个空样式,并在日历上添加BasedOn。这样,即使当前操作系统主题改变了所有其他控件的外观,您也不会被日历的相同外观所困扰。只有在实际需要更改控件的完全不同的布局时,才应以新样式更改ControlTemplate。如果您确实更改了样式中的ControlTemplate,请记住,在我看来,最佳做法是您拥有应用程序支持的所有主题的样式,至少阅读WPFSomes附带的主题,这只是一项大量工作,所以我要做的是删除硬编码颜色等样式中的所有内容,只保留这些内容其中我可以参考一些标准颜色等。。希望这有帮助