我是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中创建的代码中的控件
答案 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