如何在代码窗口中访问自定义按钮的不同控件

时间:2012-03-10 13:41:58

标签: wpf xaml

我是WPF的新手。我在XAML中创建一个自定义按钮,如下所示

<Button x:Class="WPFApp.ButtonMainMenuCat"
             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="150" d:DesignWidth="177">
    <Button.Template>
        <ControlTemplate TargetType="{x:Type Button}">
            <Grid>
                <Image Name="Background" Source="/WPFApp;component/Resources/MainScreenMenuBackground.png" Stretch="Fill" />
                <Image Name="MenuNormal" Source="/WPFApp;component/Resources/Audio_Gray.png" Stretch="Fill" Height="62" Width="56" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                <Image Name="Pressed" Source="/WPFApp;component/Resources/subMenuNormalButton.png" Stretch="Fill" Visibility="Hidden"/>
                <Image Name="Focused" Source="/WPFApp;component/Resources/buttonFocus.png" Margin="7,7,7,7" Visibility="Hidden"  Stretch="Fill"/>

            </Grid>

            <ControlTemplate.Triggers>
                <Trigger Property="IsPressed" Value="True">
                    <Setter TargetName="MenuNormal" Property="Visibility" Value="Hidden"/>
                    <Setter TargetName="Pressed" Property="Visibility" Value="Visible"/>
                </Trigger>
                <Trigger Property="IsFocused" Value="True">
                    <Setter TargetName="MenuNormal" Property="Visibility" Value="Hidden"/>
                    <Setter TargetName="Focused" Property="Visibility" Value="Visible"/>

                </Trigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>
    </Button.Template>
</Button>

后面的代码如下

namespace WPFApp
{
    /// <summary>
    /// Interaction logic for ButtonMainMenuCat.xaml
    /// </summary>
    public partial class ButtonMainMenuCat : Button
    {
        public ButtonMainMenuCat()
        {
            InitializeComponent();
        }

        public void SetMenuImage(String MenuName)
        {
            var uriSource=new Uri("");
            switch (MenuName.ToLower())
            {
                case "home":
                   uriSource = new Uri(@"/WPFApp;component/Resources/Home_Gray.png", UriKind.Relative);
                   break;
                case "video":
                    uriSource = new Uri(@"/WPFApp;component/Resources/Vedeo_Gray.png", UriKind.Relative);
                    break;
                case "audio":
                    uriSource = new Uri(@"/WPFApp;component/Resources/Audio_Gray.png", UriKind.Relative);
                    break;
                case "services":
                     uriSource = new Uri(@"/WPFApp;component/Resources/Services_Gray.png", UriKind.Relative);
                    break;
                case "shopping":
                    uriSource = new Uri(@"/WPFApp;component/Resources/Shoppings_Gray.png", UriKind.Relative);
                    break;
                case "channels":
                     uriSource = new Uri(@"/WPFApp;component/Resources/Channels_Gray.png", UriKind.Relative);
                    break;
                default:
                     uriSource = new Uri(@"/WPFApp;component/Resources/Home_Gray.png", UriKind.Relative);
                    break;
            }
            WPFApp.ButtonMainMenuCat.MenuNormal.Source = new BitmapImage(uriSource);

        }
    }
}

现在我的问题是我想在运行时更改MenuNormal图像的来源。但它给我一个错误,错误ButtonMainMenuCat'不包含'MenuNormal'的定义

因此,请建议我如何访问在XAML中创建的代码中的控件

2 个答案:

答案 0 :(得分:2)

为了在您的代码中获取'图像'的实例,您需要使用FrameworkElement.GetTemplateChild

Image menuNormal = (Image)GetTemplateChild("MenuNormal");

作为替代方案,您可以将该图像的源绑定到按钮的属性,这就是我将使用的方法。

编辑: 如果您使用GetTemplateChild,那么您还应该将TemplatePartAttribute添加到您的班级,这不是必需的,但这只是一个很好的做法。

答案 1 :(得分:1)

您需要在从Button继承的控件上注册Dependency Property,然后将图像源绑定到该属性。

然后,您可以在应用程序代码中设置该属性以更改图像。

以下是介绍:

http://www.switchonthecode.com/tutorials/wpf-tutorial-introduction-to-dependency-properties