Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.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 UserControl_Wpf_Image_User Controls_Dependency Properties - Fatal编程技术网

具有图像属性的WPF UserControl

具有图像属性的WPF UserControl,wpf,image,user-controls,dependency-properties,Wpf,Image,User Controls,Dependency Properties,我有一个UserControl库,其中包含一个用户控件,用于为windows创建自定义标题栏。我给了这个标题栏两个依赖属性-title和Icon,我希望在通过DLL使用控件时能够设置它们 我已使标题正常工作,因此当我设置窗口的ViewModel的title属性时,它将填充到标题栏中。但是,我不能让图像也这样做 我尝试了各种各样的变体,读了一整门关于使用依赖属性的课程,但我似乎无法让图像显示出来。我尝试过使用ImageSource属性、项目资源和图像,但得到的都是空白。你能为我指出解决问题的正确方

我有一个UserControl库,其中包含一个用户控件,用于为windows创建自定义标题栏。我给了这个标题栏两个依赖属性-title和Icon,我希望在通过DLL使用控件时能够设置它们

我已使标题正常工作,因此当我设置窗口的ViewModel的title属性时,它将填充到标题栏中。但是,我不能让图像也这样做

我尝试了各种各样的变体,读了一整门关于使用依赖属性的课程,但我似乎无法让图像显示出来。我尝试过使用ImageSource属性、项目资源和图像,但得到的都是空白。你能为我指出解决问题的正确方向吗

下面是我读到的usercontrol的xaml,我必须为DP使用TemplatedParent RelativeSource,因此,这是放在其中的-我相信这将在实现中引用MainViewModel:

<UserControl x:Class="WPFLibrary.User_Controls.TitleBar"
             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">
    <UserControl.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="pack://application:,,,/WPFLibrary;component/Styles/Buttons.xaml"/>
                <ResourceDictionary Source="pack://application:,,,/WPFLibrary;component/Styles/Gradients.xaml"/>
                <ResourceDictionary Source="pack://application:,,,/WPFLibrary;component/Styles/Text.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </UserControl.Resources>
    <DockPanel VerticalAlignment="Top" Grid.Row="0" Grid.ColumnSpan="3"
               MouseDown="TitleBar_MouseDown"
               DataContext="{Binding}"
               Background="{StaticResource WindowTitleBar}">
        <Grid Grid.Row="0">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="5"/>
                <ColumnDefinition Width="30"/>
                <ColumnDefinition Width="5"/>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="90"/>
            </Grid.ColumnDefinitions>
            <Image Grid.Column="1" Source="{Binding Icon,RelativeSource={RelativeSource TemplatedParent}}"/>
            <TextBlock x:Name="Title_Bar"
                       Grid.Column="3"
                       Text="{Binding Title}"
                       Style="{StaticResource Text_WindowTitle}">
            </TextBlock>
            <!--StackPanel Containing the buttons excluded for SO Question-->
        </Grid>
    </DockPanel>
</UserControl>
最后,这里是mainwindow背后的代码,它设置与MainViewModel的绑定并初始化窗口:

public partial class MainWindow : Window
{
    public MainView_Model MainView { get; set; }
    public MainWindow()
    {
        MainView = new MainView_Model();
        DataContext = MainView;
        InitializeComponent();
    }
}

老实说,我看不出这里遗漏了什么/错了什么,我读了大量的文章、问题和答案,这些基本上似乎表明我在以正确的方式做事。。。那么到底出了什么问题呢?

问题是XAML中有一个图像试图绑定到视图模型中的图像。图形用户界面对象(如图像)在视图模型层中没有位置,请将图标依赖属性更改为ImageSource类型,并将XAML图像绑定到该类型。

绑定错误。如果没有模板,则不应使用TemplatedParent。使用:

xmlns:local="clr-namespace:WPFLibrary.User_Controls"
<Image Grid.Column="1" Source="{Binding Icon, RelativeSource={RelativeSource AncestorType=local:TitleBar}}"/>

我可能没有找到您实际设置图标属性的位置。还取决于主视图的位置,模型类需要实现INofityPropertyChanged,我现在看到了。当您逐步查看它时,是否设置了Icon.Source?我以为我正在为mainView\u模型的构造函数中设置Icon属性。。。正在设置图标。源是否未设置图像?我在INotifyPropertyChange实现中添加了,但这并没有解决问题。您是否已完成并确保设置了.Source?这有用吗。已设置源,但所有其他属性都是默认值或空的。顺便说一下,该映像是System.Windows.Controls.Image,而不是System.Drawing.Image。这引起了我的焦虑,所以我想我会提到!我读了一个不同的SO答案,并将构建操作设置为组件!我尝试了两种方法,但都没有解决问题。我不确定我是否完全理解如何实现这一点-我将UserControl中的DP类型更改为ImageSource,并将视图模型中的DP类型更改为ImageSource,像以前一样使用BitmapImage设置源,但这不起作用。我还将一个图像作为静态资源添加到xaml中,并将新的ImageSource DP绑定到该资源,但它也失败了。对不起,我想我把自己弄糊涂了。请你再详细一点好吗?我已经尝试了更多的方法,现在我确定我不知道如何正确地实现你所描述的,明白了!结合@Rekshino的回答,这就解决了问题——我将引用放在MainWindow.xaml.cs中,而不是视图模型中,并使用它直接设置Titlebar.Icon=bitmap。我希望我能标记出两个答案!这一点,再加上@markfeldman的答案,已经解决了这个问题。我希望我能标记出两个答案@HighPlainsGritter发现得很好,我没注意到。
namespace Demo_of_WPF_Library.ViewModel
{
    public class MainView_Model
    {
        private string _title;
        public string Title
        {
            get { return _title; }
            set { _title = value; }
        }
        private Image _icon;

        public Image Icon
        {
            get { return _icon; }
            set { _icon = value; }
        }

        public MainView_Model()
        {
            Title = "Demo WPF Library";
            Icon = new Image();
            Icon.Source = new BitmapImage(new Uri("/View/Images/IsItOk.ico",UriKind.Relative));
        }
    }
}
public partial class MainWindow : Window
{
    public MainView_Model MainView { get; set; }
    public MainWindow()
    {
        MainView = new MainView_Model();
        DataContext = MainView;
        InitializeComponent();
    }
}
xmlns:local="clr-namespace:WPFLibrary.User_Controls"
<Image Grid.Column="1" Source="{Binding Icon, RelativeSource={RelativeSource AncestorType=local:TitleBar}}"/>