WPF,创建用户控件

u012139107 2013-09-16 01:02:29
创建了一个继承自UserControl的用户控件,然后手动改成了继承自Window。如下:

后台:

public partial class MyWindow : Window
{
public MyWindow()
{
InitializeComponent();
}
....
....
}


前台:

<Window x:Class="WPF熊俊.MyWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">

....
....
</Window>


这样改了之后,工具栏怎么没有看到这个用户控件?
请问,这样改了之后,如何使用这个自定义的窗体?
...全文
273 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
DENQH 2013-09-17
  • 打赏
  • 举报
回复
引用 18 楼 u012139107 的回复:
[quote=引用 17 楼 jshi123 的回复:] 这是做不到的,UserControl(由xaml定义的类)不能作为根节点元素,不管你把它的基类改成什么。
我已经改成了自定义控件,而非UserControl。一个继承自Window的CustomControl1类,请问,怎么使用呢?[/quote] <S:MyWindow x:Class="空间名.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:S="clr-namespace:WpfWin;assembly=WpfWin" Title="Window2" Height="300" Width="300"> <Grid> <TextBlock Text="gggggg"></TextBlock> </Grid> </S:MyWindow> 关键是 xmlns:S="clr-namespace:WpfWin;assembly=WpfWin" 第一个WpfWin是你控件的空间名,第二个是你控件的DLL名,MyWindow是你继承的类名 你要引用你生成控件DLL文件 不过继承Window要考虑的问题太多,很少人去做
u012139107 2013-09-17
  • 打赏
  • 举报
回复
引用 17 楼 jshi123 的回复:
这是做不到的,UserControl(由xaml定义的类)不能作为根节点元素,不管你把它的基类改成什么。
我已经改成了自定义控件,而非UserControl。一个继承自Window的CustomControl1类,请问,怎么使用呢?
jshi123 2013-09-17
  • 打赏
  • 举报
回复
这是做不到的,UserControl(由xaml定义的类)不能作为根节点元素,不管你把它的基类改成什么。
u012139107 2013-09-16
  • 打赏
  • 举报
回复
引用 13 楼 DENQH 的回复:
中间那段XAML是放在Themes/Generic.xaml里,你没用过自定义控件么? 最下面那段XAML是你新建一个应用项目后,添加引用生成的DLL,手动改,你也可以改为<S:MyWindow x:Class="空间名.MainWindow"
我照你这么写,怎么不行呢?

<Window x:Class="WPF熊俊.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WPF熊俊">   
</Window>
想把Window标签改为local:CustomControl1(CustomControl1是继承自Window的),改不了啊
u012139107 2013-09-16
  • 打赏
  • 举报
回复
[quote=引用 13 楼 DENQH 的回复:] 中间那段XAML是放在Themes/Generic.xaml里,你没用过自定义控件么? 最下面那段XAML是你新建一个应用项目后,添加引用生成的DLL,手动改,你也可以改为<S:MyWindow x:Class="空间名.MainWindow"[/quote你是说第三段代码是这样的吗:启动应用程序后,启动的是MainWindow,需要手动修改为<S:MyWindow x:Class="空间名.MainWindow">吗?
u012139107 2013-09-16
  • 打赏
  • 举报
回复
引用 13 楼 DENQH 的回复:
中间那段XAML是放在Themes/Generic.xaml里,你没用过自定义控件么? 最下面那段XAML是你新建一个应用项目后,添加引用生成的DLL,手动改,你也可以改为<S:MyWindow x:Class="空间名.MainWindow"
没用过自定义控件。其实我的问题是,使用用户控件(不是自定义控件),可不可以创建一个自定义的窗体,并使用它,怎么使用?
DENQH 2013-09-16
  • 打赏
  • 举报
回复
中间那段XAML是放在Themes/Generic.xaml里,你没用过自定义控件么? 最下面那段XAML是你新建一个应用项目后,添加引用生成的DLL,手动改,你也可以改为<S:MyWindow x:Class="空间名.MainWindow"
u012139107 2013-09-16
  • 打赏
  • 举报
回复
引用 11 楼 DENQH 的回复:
用自定义控件 public class MyWindow : Window
    {
        static MyWindow()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(MyWindow), new FrameworkPropertyMetadata(typeof(MyWindow)));
        } 
        public override void OnApplyTemplate()//重写模板
        {
            base.OnApplyTemplate();          
        }
        //可以重写其他的
    }
 <Style TargetType="{x:Type local:MyWindow}">
        <Setter Property="MinWidth"  Value="300"/>
        <Setter Property = "MinHeight" Value="300"/>
        <Setter Property="ResizeMode"  Value="NoResize"/>   //这些你应知吧
        <Setter Property = "WindowStyle" Value="None"/>
        <Setter Property = "Height" Value="760"/>
        <Setter Property="Width"  Value="1180"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:MyWindow}">
                    <Border BorderThickness="2" BorderBrush="#FF007ACC" Background="White">
                        <Grid> 
                       //设你的头部样式,边框,按钮等等    
                          <Grid>
                                <ContentPresenter />
                            </Grid>
                        </Grid>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsEnabled" Value="False">
                            <Setter Property="Foreground" Value="#FF878C8F"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
应用:添加引用生成的DLL
<S:MyWindow x:Class="空间名.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:S="clr-namespace:WpfWin;assembly=WpfWin"
        Title="Window2" Height="300" Width="300">
    <Grid>
        <TextBlock Text="gggggg"></TextBlock>
    </Grid>
</S:MyWindow>
中间那段XAML是放在哪里的? 最下面那段XAML是哪里整出来的?启动程序的时候,不是MainWinow吗?
DENQH 2013-09-16
  • 打赏
  • 举报
回复
用自定义控件 public class MyWindow : Window
    {
        static MyWindow()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(MyWindow), new FrameworkPropertyMetadata(typeof(MyWindow)));
        } 
        public override void OnApplyTemplate()//重写模板
        {
            base.OnApplyTemplate();          
        }
        //可以重写其他的
    }
 <Style TargetType="{x:Type local:MyWindow}">
        <Setter Property="MinWidth"  Value="300"/>
        <Setter Property = "MinHeight" Value="300"/>
        <Setter Property="ResizeMode"  Value="NoResize"/>   //这些你应知吧
        <Setter Property = "WindowStyle" Value="None"/>
        <Setter Property = "Height" Value="760"/>
        <Setter Property="Width"  Value="1180"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:MyWindow}">
                    <Border BorderThickness="2" BorderBrush="#FF007ACC" Background="White">
                        <Grid> 
                       //设你的头部样式,边框,按钮等等    
                          <Grid>
                                <ContentPresenter />
                            </Grid>
                        </Grid>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsEnabled" Value="False">
                            <Setter Property="Foreground" Value="#FF878C8F"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
应用:添加引用生成的DLL
<S:MyWindow x:Class="空间名.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:S="clr-namespace:WpfWin;assembly=WpfWin"
        Title="Window2" Height="300" Width="300">
    <Grid>
        <TextBlock Text="gggggg"></TextBlock>
    </Grid>
</S:MyWindow>
u012139107 2013-09-16
  • 打赏
  • 举报
回复
该怎么用这个自定义的窗体呢?
u012139107 2013-09-16
  • 打赏
  • 举报
回复
引用 8 楼 qldsrx 的回复:
[quote=引用 7 楼 u012139107 的回复:] 那请问,该如何使用这个自定义的窗体呢?
这要看你哪里要用到这样的设计,Window在Xaml里面算是顶级的元素了,能够包含Window的元素应该不会很多,我也没时间去找。但是UserControl就不同,可以用在很多场合,甚至可以直接作为一个单独的窗体显示,你为啥不能用UserControl来定义呢?[/quote] 我是自定义的Window啊,用UserControl怎么定义啊,不继承Window吗?不会像一般的用户控件那样拖到窗口,就成自定义的窗体吧?
qldsrx 2013-09-16
  • 打赏
  • 举报
回复
引用 7 楼 u012139107 的回复:
那请问,该如何使用这个自定义的窗体呢?
这要看你哪里要用到这样的设计,Window在Xaml里面算是顶级的元素了,能够包含Window的元素应该不会很多,我也没时间去找。但是UserControl就不同,可以用在很多场合,甚至可以直接作为一个单独的窗体显示,你为啥不能用UserControl来定义呢?
u012139107 2013-09-16
  • 打赏
  • 举报
回复
引用 3 楼 qldsrx 的回复:
只有UserControl可以被看到,Window无法看到。一个窗体无法作为控件被再次使用。
那请问,该如何使用这个自定义的窗体呢?
DENQH 2013-09-16
  • 打赏
  • 举报
回复
如不对就用<my:MyWindow x:Class="WPF熊俊.Window"
DENQH 2013-09-16
  • 打赏
  • 举报
回复
引用加载后 <my:Window x:Class="WPF熊俊.Window" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:my="clr-namespace:WPF熊俊;assembly=WPF熊俊Dll" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="300"> .... .... </my:Window
DENQH 2013-09-16
  • 打赏
  • 举报
回复
引用加载后 <MyWindow:Window x:Class="WPF熊俊.Window" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:my="clr-namespace:WPF熊俊" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="300"> .... .... </Window
qldsrx 2013-09-16
  • 打赏
  • 举报
回复
只有UserControl可以被看到,Window无法看到。一个窗体无法作为控件被再次使用。
申江渔夫 2013-09-16
  • 打赏
  • 举报
回复
你编译过了吗,没有编译过是不会在工具栏中出现的。
coobai 2013-09-16
  • 打赏
  • 举报
回复
MyWindow 继承 Window,那它就是一个Window对象,不再是UserControl用户控件了。

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧