none
wpf继承包含有xaml的control RRS feed

  • 问题

  • Hi,

    请教个问题,假如我自定义了一个用户控件(包含usercontrol1.xaml、usercontrol1.xaml.cs),现在我有新的要求,在该控件下分别需要进行2个很小的界面改动。原先我想使用继承,但是xaml不能直接继承。

    我目前想到的方法是

    1、将usercontrol1的xaml内容用controltemplate、style来定义好

    2、usertrol1.cs的构造函数中将资源加载。

    3、在usertrol1.cs的Loaded事件内把点击等事件实现。

    对于一些简单的界面可以完成该功能,但是对于一些比较复杂的界面,比如界面包含了Listbox,listbox的itemtemplate包含了点击事件时,不能很好的按上面步骤解决,如下

    <DataTemplate x:Key="TagListBoxItemTemplate">
                <Grid>
                    <Button Style="{Binding CanDelete,Converter={StaticResource TagDeleteStyleConverter}}" Click="OnDeleteTag" 
                            HorizontalContentAlignment="Stretch" VerticalContentAlignment="Bottom"
                            Tag="{Binding DataContext, RelativeSource={RelativeSource TemplatedParent}}">
                        <Grid>
                            <TextBlock Text="{Binding Tag}" Style="{DynamicResource Level4ContentTextBlockStyle}"
                                       HorizontalAlignment="Center" Padding="5 0"
                                       TextTrimming="CharacterEllipsis" VerticalAlignment="Bottom"></TextBlock>
                        </Grid>
                    </Button>
                </Grid>
            </DataTemplate>

    这里很难再Loaded下构建datatemplate内的click事件。

    请问当我想继承自定义控件时,该如何解决上面这些问题。谢谢





    code

    2017年3月6日 8:14

答案

全部回复


  • Hi skczjun,

    1: 定义一个被继承的用户控件基类,并且不应包含xaml文件。 在单个cs文件中定义它,并将其定义为直接从UserControl继承。

    2: 它的样式和模板定义,直接使用Style去设定。

    3: 继承的类确保继承自定义的用户控件基类.

    下面的代码也许对你有帮助

     <Style TargetType="{x:Type local:TestBaseCtrl}">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type local:TestBaseCtrl}">
                            <StackPanel>
                                <Button Height="23" Margin="4" Content="Test1" x:Name="btnTest1" Command="{x:Static local:TestBaseCtrl.TestButton1}">
                                </Button>
                             
                                </Button>
                            </StackPanel>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
    
        public class TestBaseCtrl : UserControl
        {
            public static RoutedCommand TestButton1 = new RoutedCommand();
    
            static TestBaseCtrl()
            {
                DefaultStyleKeyProperty.OverrideMetadata(typeof(TestBaseCtrl), new FrameworkPropertyMetadata(typeof(TestBaseCtrl)));
            }
    
            public TestBaseCtrl()
            {
                this.CommandBindings.Add(new CommandBinding(TestButton1, TestButton1_Executed));
               
            }
    
            private void TestButton1_Executed(object sender, ExecutedRoutedEventArgs e)
            {
                MessageBox.Show("This is button 1 from the base control");
            }
       
        }
    
    


    Best Regards,

    Yohann Lu


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    • 已标记为答案 skczjun 2017年3月8日 3:05
    • 取消答案标记 skczjun 2017年3月8日 3:06
    2017年3月7日 9:13
    版主
  • 你好,

    假如我有2个usercontrol,分别是usercontrol1、usercontrol2.

    其中usercontrol1的xaml是

    <UserControl>
    <Grid>
    <!-- 大量布局代码-->
    <Button>UserControl1</Button>
    </Grid>
    </UserControl>


    而usercontrol2的xaml与usercontrol1的xaml基本一致,只是有某一小部分是不一样的,

    <UserControl>
    <Grid>
    <!-- 大量布局代码-->
    <CheckBox>UserControl2</CheckBox>
    </Grid>
    </UserControl>

    如果我想要实现复用他们的xaml代码,是否,将xaml都分别定为为style1、style2,click之类的事件也要改为命令绑定模式吗?如果只有单个click的话还好处理,但是如果出现leftbuttondown等事件,该如何将这些事件与Ui分离呢?

    谢谢



    code



    • 已编辑 skczjun 2017年3月8日 3:26
    2017年3月8日 3:16
  • HI FAE9D91C-3F07-4090-91EB-E3F70E4D0617,

    有没有demo或xaml之类的,对于你说的xaml继承不是很清楚


    code

    2017年3月9日 1:11
  • ?????

    • 已标记为答案 skczjun 2017年3月10日 8:33
    • 已编辑 [-] 2018年1月11日 11:54
    2017年3月10日 4:09