简体   繁体   English

Visual Studio 2010中的Bogus WPF / XAML错误

[英]Bogus WPF / XAML errors in Visual Studio 2010

There are errors hanging around, but at runtime everything works. 有错误,但在运行时一切正常。

Right now, I'm getting Cannot locate resource 'img/icons/silk/arrow_refresh.png'. 现在,我得到了Cannot locate resource 'img/icons/silk/arrow_refresh.png'.

在此输入图像描述

I've got a simple UserControl called ImageButton (doesn't everyone?): 我有一个名为ImageButton的简单UserControl(不是每个人都有?):

<UserControl x:Class="MyProj.src.controls.ImageButton"
             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">
    <Button Name="btnButton" Click="btnButton_Click">
        <StackPanel Orientation="Horizontal">
            <Image Name="btnImage" Stretch="None" />
            <TextBlock Name="btnText" />
        </StackPanel>
    </Button>
</UserControl>

Which does what you'd expect: 这符合您的期望:

[ContentProperty("Text")]
public partial class ImageButton : UserControl
{
    public String Image { set { btnImage.Source = GuiUtil.CreateBitmapImage(value); } }
    public String Text { set { btnText.Text = value; } }
    public double Gap { set { btnImage.Margin = new Thickness(0, 0, value, 0); } }
    public bool ToolBarStyle { set { if (value) { 
        btnButton.Style = (Style)FindResource(ToolBar.ButtonStyleKey); } }
    }
    public bool IsCancel { set { btnButton.IsCancel = value; } }
    public bool IsDefault { set { btnButton.IsDefault = value; } }

    public event RoutedEventHandler Click;

    public ImageButton()
    {
        InitializeComponent();
    }

    private void btnButton_Click(object sender, RoutedEventArgs e)
    {
        if (Click != null)
        {
            Click(sender, e);
        }
    }
}

Where CreateBitmapImage is the following: CreateBitmapImage的位置如下:

public static BitmapImage CreateBitmapImage(string imagePath)
{
    BitmapImage icon = new BitmapImage();
    icon.BeginInit();
    icon.UriSource = new Uri(String.Format("pack://application:,,,/{0}", imagePath));
    icon.EndInit();
    return icon;
}

I can't see the design view of any xaml file that uses an ImageButton like such: 我看不到使用像这样的ImageButton的任何xaml文件的设计视图:

<Window
    foo="bar"
    xmlns:wpfControl="clr-namespace:MyProj.src.controls">
    <Grid>
        <wpfControl:ImageButton ToolBarStyle="True" Gap="3" 
            Click="btnRefresh_Click" Text="Refresh"
            Image="img/icons/silk/arrow_refresh.png" />
    </Grid>
</Window>

Why is VS complaining? 为什么VS抱怨?

I would suggest using Dependency Properties and Bindings when creating a Control. 我建议在创建Control时使用Dependency Properties和Bindings。 The benefits of this will be many, for example you'll be able to Bind the Image property for the ImageButton and you won't run in to problems like the one in your question. 这样做的好处很多,例如,您可以为ImageButton绑定Image属性,而不会遇到问题中的问题。

Instead of using the setter in the Properties to set the Image source and TextBlock Text, you can bind them to the properties for the ImageButton UserControl . 您可以将它们绑定到ImageButton UserControl的属性,而不是使用属性中的setter来设置Image源和TextBlock Text。

Update 更新
I put together a small sample project with ImageButton here: http://www.mediafire.com/?vlk4m7svttyjd6t 我在这里用ImageButton组建了一个小样本项目: http//www.mediafire.com/? ImageButton

Your Xaml can look like this 你的Xaml看起来像这样

<UserControl ...
             x:Name="imageButton">
    <Button...>
        <StackPanel Orientation="Horizontal">
            <Image Source="{Binding ElementName=imageButton, Path=Image}" .../>
            <TextBlock Text="{Binding ElementName=imageButton, Path=Text}" .../>
        </StackPanel>
    </Button>
</UserControl>

And then you replace the CLR Properties with Dependency properties like below in code behind 然后在后面的代码中替换CLR Properties with Dependency属性,如下所示

public partial class ImageButton : UserControl
{
    public static readonly DependencyProperty ImageProperty =
        DependencyProperty.Register("Image",
            typeof(ImageSource),
            typeof(ImageButton),
            new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsMeasure));
    public ImageSource Image
    {
        get { return (ImageSource)base.GetValue(ImageProperty); }
        set { base.SetValue(ImageProperty, value); }
    }

    public static readonly DependencyProperty TextProperty =
        DependencyProperty.Register("Text",
            typeof(string),
            typeof(ImageButton),
            new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsRender | FrameworkPropertyMetadataOptions.AffectsMeasure));
    public string Text
    {
        get { return (string)base.GetValue(TextProperty); }
        set { base.SetValue(TextProperty, value); }
    }
    //...
}

For the Gap property you can either Bind Margin with a Converter or use the PropertyChangedCallback to set it in code behind. 对于Gap属性,您可以使用转换器绑定边距,也可以使用PropertyChangedCallback在代码后面设置它。

Hope that helps 希望有所帮助

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM