none
依赖属性及其数据绑定 怎么得不到值呢 RRS feed

  • 问题

  • ucButton.xaml

    <Button x:Class="JStore.UI.ucButton"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
        <Button.Resources>
            <!--定义按钮样式-->
            <Style x:Key="ButtonStyle" TargetType="{x:Type Button}">
                <Setter Property="Foreground" Value="White"/>
                <Setter Property="Template">
                    <Setter.Value>
                        <!--设置样式 -->
                        <ControlTemplate TargetType="{x:Type Button}">
                            <Grid>
                                <Rectangle HorizontalAlignment="{Binding Path=ImgAlignment}" Width="31" Height="19" Name ="Rectangle">
                                    <Rectangle.Fill>
                                        <ImageBrush ImageSource="Images/btnClose_Normal.png" ></ImageBrush>
                                    </Rectangle.Fill>
                                </Rectangle>
                            </Grid>
                            <!-- 设置鼠标移到关闭按钮上的效果 -->
                            <ControlTemplate.Triggers>
                                <Trigger Property ="IsMouseOver" Value ="True">
                                    <Setter Property="Fill" TargetName="Rectangle">
                                        <Setter.Value>
                                            <ImageBrush ImageSource="Images/btnClose_MouseOver.png" ></ImageBrush>
                                        </Setter.Value>
                                    </Setter>
                                </Trigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </Button.Resources>
        <Grid>
    
        </Grid>
    </Button>
    

    ucButton.xaml.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    
    namespace JStore.UI
    {
        /// <summary>
        /// ucButton.xaml 的交互逻辑
        /// </summary>
        public partial class ucButton : Button
        {
            public ucButton()
            {
                InitializeComponent();
                this.Style = Resources["ButtonStyle"] as Style;
            }
    
            public HorizontalAlignment ImgAlignment
            {
                get { return (HorizontalAlignment)GetValue(ImgAlignmentProperty); }
                set { SetValue(ImgAlignmentProperty, value); }
            }
            public static readonly DependencyProperty ImgAlignmentProperty = DependencyProperty.Register("ImgAlignment", typeof(HorizontalAlignment), typeof(ucButton), null);
    
        }
    }
    

    window1.xaml

    <Window x:Class="JStore.WPF.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:uc="clr-namespace:JStore.UI;assembly=UI"
        Title="MainWindow" Height="720" Width="990">
        <Grid>
            <uc:ucButton Height="23" HorizontalAlignment="Right" Margin="0,101,54,0" Name="ucButton1" VerticalAlignment="Top" Width="75" ImgAlignment="Left">Button</uc:ucButton>
        </Grid>
    </Window>
    

    2012年11月13日 8:54

答案

  • wpf 没有像你这样做的,这样是完全错误的方向。

    1)Window1窗体用上ucWindow 的界面, ucWindow的解释是ucWindow自己的content,自己的child,你要把别人孩子放到自己家里面这个是没有意义的, ucWindow界面是一堆控件,是一堆实例,你不在Window1 new出来这一堆实例 你如何能做到把那些东西应用到Window1 里面来呢?所以解决方案只有一个,复制ucWindow的代码,粘贴到ucWindow里面来,当然如果你会使用template也是可以的,正常情况都是用Template,像我之前告诉你的那样,但是你完全不去学,也不听我说话,这里我再说最后一个次,要么粘贴复制,要么用template,把template定义在resource里面

    <ControlTemplate x:Key="WindowTemplate" TargetType="{x:Type Window}">
                <Border CornerRadius="0,0,0,0"
                    BorderBrush="#9AA7B6"
                    BorderThickness="1"
                    Margin="10,10,10,10">
                    <Border.Effect>
                        <DropShadowEffect Color="Gray" BlurRadius="10" ShadowDepth="0" Opacity="0.8" />
                    </Border.Effect>
                    <Border.Background>
                        <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
                            <GradientStop Color="White" Offset="0"/>
                            <GradientStop Color="#E5E7EB" Offset="0.93"/>
                        </LinearGradientBrush>
                    </Border.Background>
                </Border>
            </ControlTemplate>

    然后引用到wpf window里面

    Title="Window1" Template="{StaticResource WindowTemplate}" Height="300" Width="300"

    关于你的第二个问题:我觉得你这样做特别特别的奇怪,反正我说的你不做,那么我就针对你的问题告诉你wrokaround,把你的绑定换成这样的:

    <Rectangle HorizontalAlignment="{Binding RelativeSource={RelativeSource  AncestorType=my:ucButton, Mode=FindAncestor}, Path=ImgAlignment}" Width="31" Height="19" Name ="Rectangle">
    你的button的template写的也有很大问题,不过你这个帖子问的不是这个问题 你自己尝试着解决吧。


    Sheldon _Xiao[MSFT]
    MSDN Community Support | Feedback to us
    Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2012年11月14日 7:17
    版主
  • 你这里的Binding是有一些问题的,你需要实现的功能可以换个思路就会很简单,

    首先你创建一个新的CustomControl,

    在cs文件中:

    public class ucButton : Button
        {
            static ucButton()
            {
                DefaultStyleKeyProperty.OverrideMetadata(typeof(ucButton), new FrameworkPropertyMetadata(typeof(ucButton)));
            }
    
            public HorizontalAlignment ImgAlignment
            {
                get { return (HorizontalAlignment)GetValue(ImgAlignmentProperty); }
                set { SetValue(ImgAlignmentProperty, value); }
            }
            public static readonly DependencyProperty ImgAlignmentProperty = DependencyProperty.Register("ImgAlignment", typeof(HorizontalAlignment), typeof(ucButton), null);
    
        }

    在自动生成的Themes\Generic中:

    <ResourceDictionary
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="你的namespace">
        <Style TargetType="{x:Type local:ucButton }">
            <Setter Property="Foreground" Value="White"/>
            <Setter Property="Template">
                <Setter.Value>
                    <!--设置样式 -->
                    <ControlTemplate TargetType="{x:Type local:ucButton }">
                        <Grid>
                            <Rectangle HorizontalAlignment="{TemplateBinding ImgAlignment}" Width="31" Height="19" Name ="Rectangle">
                                <Rectangle.Fill>
                                    <ImageBrush ImageSource="Path" ></ImageBrush>
                                </Rectangle.Fill>
                            </Rectangle>
                        </Grid>
                        <!-- 设置鼠标移到关闭按钮上的效果 -->
                        <ControlTemplate.Triggers>
                            <Trigger Property ="IsMouseOver" Value ="True">
                                <Setter Property="Fill" TargetName="Rectangle">
                                    <Setter.Value>
                                        <ImageBrush ImageSource="Path" ></ImageBrush>
                                    </Setter.Value>
                                </Setter>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </ResourceDictionary>

    Thanks! Damon.Tian

    • 已标记为答案 Lacuz 2012年11月15日 2:54
    2012年11月14日 7:33

全部回复

  • 我没测试 我粗略看一下你的代码 这部分:

    <Style x:Key="ButtonStyle" TargetType="{x:Type Button}">
    你既然用的是uc:ucButton ,那么你的style为什么TargetType不是x:Type uc:ucButton 呢?


    Sheldon _Xiao[MSFT]
    MSDN Community Support | Feedback to us
    Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2012年11月13日 9:03
    版主
  • 错误 1 类型引用无法找到名为“ucButton”的公共类型。 行 6 位置 67.

    用了ucButton会报错

    我这样style能读到,但是依赖属性的数据读不到,其他固定的样式可以,比如图片地址
    • 已编辑 Lacuz 2012年11月14日 0:19
    2012年11月14日 0:17
  • 算了 跟你很难说明白,你新建个项目,然后重现你的问题,上传到skydrive上吧, 我看你项目,告诉我问题出在哪里 我根据你项目改


    Sheldon _Xiao[MSFT]
    MSDN Community Support | Feedback to us
    Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2012年11月14日 5:05
    版主
  • http://sdrv.ms/W3Se8e

    UI自定义控件库的工程里有ucWindow 和 ucButton

    我想WPF工程里的Window1窗体用上ucWindow 的界面,里面的按钮用ucButton,并绑定Button的背景图片的对其方式的依赖属性

    2012年11月14日 6:11
  • wpf 没有像你这样做的,这样是完全错误的方向。

    1)Window1窗体用上ucWindow 的界面, ucWindow的解释是ucWindow自己的content,自己的child,你要把别人孩子放到自己家里面这个是没有意义的, ucWindow界面是一堆控件,是一堆实例,你不在Window1 new出来这一堆实例 你如何能做到把那些东西应用到Window1 里面来呢?所以解决方案只有一个,复制ucWindow的代码,粘贴到ucWindow里面来,当然如果你会使用template也是可以的,正常情况都是用Template,像我之前告诉你的那样,但是你完全不去学,也不听我说话,这里我再说最后一个次,要么粘贴复制,要么用template,把template定义在resource里面

    <ControlTemplate x:Key="WindowTemplate" TargetType="{x:Type Window}">
                <Border CornerRadius="0,0,0,0"
                    BorderBrush="#9AA7B6"
                    BorderThickness="1"
                    Margin="10,10,10,10">
                    <Border.Effect>
                        <DropShadowEffect Color="Gray" BlurRadius="10" ShadowDepth="0" Opacity="0.8" />
                    </Border.Effect>
                    <Border.Background>
                        <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
                            <GradientStop Color="White" Offset="0"/>
                            <GradientStop Color="#E5E7EB" Offset="0.93"/>
                        </LinearGradientBrush>
                    </Border.Background>
                </Border>
            </ControlTemplate>

    然后引用到wpf window里面

    Title="Window1" Template="{StaticResource WindowTemplate}" Height="300" Width="300"

    关于你的第二个问题:我觉得你这样做特别特别的奇怪,反正我说的你不做,那么我就针对你的问题告诉你wrokaround,把你的绑定换成这样的:

    <Rectangle HorizontalAlignment="{Binding RelativeSource={RelativeSource  AncestorType=my:ucButton, Mode=FindAncestor}, Path=ImgAlignment}" Width="31" Height="19" Name ="Rectangle">
    你的button的template写的也有很大问题,不过你这个帖子问的不是这个问题 你自己尝试着解决吧。


    Sheldon _Xiao[MSFT]
    MSDN Community Support | Feedback to us
    Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2012年11月14日 7:17
    版主
  • 你这里的Binding是有一些问题的,你需要实现的功能可以换个思路就会很简单,

    首先你创建一个新的CustomControl,

    在cs文件中:

    public class ucButton : Button
        {
            static ucButton()
            {
                DefaultStyleKeyProperty.OverrideMetadata(typeof(ucButton), new FrameworkPropertyMetadata(typeof(ucButton)));
            }
    
            public HorizontalAlignment ImgAlignment
            {
                get { return (HorizontalAlignment)GetValue(ImgAlignmentProperty); }
                set { SetValue(ImgAlignmentProperty, value); }
            }
            public static readonly DependencyProperty ImgAlignmentProperty = DependencyProperty.Register("ImgAlignment", typeof(HorizontalAlignment), typeof(ucButton), null);
    
        }

    在自动生成的Themes\Generic中:

    <ResourceDictionary
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="你的namespace">
        <Style TargetType="{x:Type local:ucButton }">
            <Setter Property="Foreground" Value="White"/>
            <Setter Property="Template">
                <Setter.Value>
                    <!--设置样式 -->
                    <ControlTemplate TargetType="{x:Type local:ucButton }">
                        <Grid>
                            <Rectangle HorizontalAlignment="{TemplateBinding ImgAlignment}" Width="31" Height="19" Name ="Rectangle">
                                <Rectangle.Fill>
                                    <ImageBrush ImageSource="Path" ></ImageBrush>
                                </Rectangle.Fill>
                            </Rectangle>
                        </Grid>
                        <!-- 设置鼠标移到关闭按钮上的效果 -->
                        <ControlTemplate.Triggers>
                            <Trigger Property ="IsMouseOver" Value ="True">
                                <Setter Property="Fill" TargetName="Rectangle">
                                    <Setter.Value>
                                        <ImageBrush ImageSource="Path" ></ImageBrush>
                                    </Setter.Value>
                                </Setter>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </ResourceDictionary>

    Thanks! Damon.Tian

    • 已标记为答案 Lacuz 2012年11月15日 2:54
    2012年11月14日 7:33
  • 不是不听你说的。。。是不会

    原来可以这么用模板,我才刚知道

     Template="{StaticResource WindowTemplate}"

    之前用winform 是直接在cs文件里继承ucWindow

    public partial class window1: ucWindow

    WPF的模式有点弄不懂,所以你会觉得我做的很奇怪。。

    能不能把我的demo写成正常的模式,要求是2个自定义控件可以方便的多次使用……


    • 已编辑 Lacuz 2012年11月14日 8:10
    2012年11月14日 8:08
  • 你千万别用winform的开发方式做WPF,我告诉你如何做了,你自己试试,绑定部分我也给你写好了,剩下的你要边学边弄,遇到问题再开帖子再问。


    Sheldon _Xiao[MSFT]
    MSDN Community Support | Feedback to us
    Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2012年11月14日 8:35
    版主
  • 主窗体和子窗体都有个共同之处

    就是 边框带阴影、都有子定义控件的系统按钮(窗体最大/小化、关闭按钮)

    这样的需求不能把他做成自定义window控件吗?只能放在资源字典里?

    正确的作法是什么?

    如果做成自定义window控件子窗口,我用实例化可以show出来,但是主窗口貌似用Template="{StaticResource WindowTemplate}" 不行


    • 已编辑 Lacuz 2012年11月14日 8:58
    2012年11月14日 8:55
  • 上面 Damon.Tian 的代码看懂了,自定义控件终于知道怎么用了。。。
    2012年11月14日 8:56
  • 创建custom window 正确的方法就是这样的。

    http://www.codeproject.com/Articles/140267/Create-Custom-Windows-in-WPF-with-Ease


    Sheldon _Xiao[MSFT]
    MSDN Community Support | Feedback to us
    Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2012年11月14日 9:00
    版主
  • 3Q我试试

    2012年11月15日 0:58
  • 奇怪,我把图片作为依赖属性的时候怎么取不到?

    ucButton.xaml.cs

    public static readonly DependencyProperty BackgroundImageProperty = DependencyProperty.Register("BackgroundImage", typeof(ImageSource), typeof(ucButton), null);
            public ImageSource BackgroundImage
            {
                get { return (ImageSource)GetValue(BackgroundImageProperty); }
                set { SetValue(BackgroundImageProperty, value); }
            }

    Generic.xaml

    <Style TargetType="{x:Type local:ucButton}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type local:ucButton}">
                        <Grid>
                            <Rectangle HorizontalAlignment="{TemplateBinding ImgAlignment}" Width="31" Height="19" Name ="Rectangle">
                                <Rectangle.Fill>
                                    <ImageBrush ImageSource="{TemplateBinding BackgroundImage}" ></ImageBrush>
                                </Rectangle.Fill>
                            </Rectangle>
                        </Grid>
                        <!-- 设置触发器 -->
                        <ControlTemplate.Triggers>
                            <Trigger Property ="IsMouseOver" Value ="True">
                                <Setter Property="Fill" TargetName="Rectangle">
                                    <Setter.Value>
                                        <ImageBrush ImageSource="Images/btnClose_MouseOver.png"></ImageBrush>
                                    </Setter.Value>
                                </Setter>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

    window1.xaml

    <Window x:Class="JStore.WPF.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:uc="clr-namespace:JStore.UI;assembly=UI"
        Title="MainWindow" Width="990" Height="720" MouseLeftButtonDown="DragWindow" WindowStartupLocation="CenterScreen">
        <Grid>
            <uc:ucButton Height="23" Margin="0,12,12,0" Name="button1" VerticalAlignment="Top" Click="button1_Click" BackgroundImage="/WPF;component/Images/btnClose_Normal.png" HorizontalAlignment="Right" Width="75" ImgAlignment="Left"></uc:ucButton>
        </Grid>
    </Window>


    • 已编辑 Lacuz 2012年11月15日 1:58
    2012年11月15日 1:57
  • 你开个新帖子, 最后一个帖子的问题已经跟这个帖子是两个独立的问题了, 吧新帖子连接给我,我会在那里跟你讨论。

    一个帖子一个问题。


    Sheldon _Xiao[MSFT]
    MSDN Community Support | Feedback to us
    Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2012年11月15日 2:27
    版主
  • 为什么MainWindow用了Template="{StaticResource ucWindow}"之后

    模板是引用成功了, 但是MainWindow里的控件都看不见了

    2012年11月15日 4:56
  • 你模板也的有问题, 有看你模板里有呈现content的presenter么? 没有控件如何呈现


    Sheldon _Xiao[MSFT]
    MSDN Community Support | Feedback to us
    Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2012年11月15日 4:58
    版主
  • 原来这个是显示内容的。。

    加上完美解决了- -,谢谢Sheldon _Xiao

                                <DockPanel>
                                    <AdornerDecorator>
                                        <ContentPresenter />
                                    </AdornerDecorator>
                                </DockPanel>

    2012年11月15日 5:39