更改图像对象可见性

本文关键字:可见性 对象 图像 | 更新日期: 2023-09-27 18:10:04

我有一些图像在我的项目。我想在按下按钮时将其属性Visibility更改为true。我已经创建了一个图像

 <Image Name="UserimgRock" Source="Rock.png" HorizontalAlignment="Left" Height="100" Margin="277" VerticalAlignment="Top" Width="100" Visibility="Hidden"/>

按钮
private void btnRock_Click(object sender, RoutedEventArgs e)
    {
        
        UserimgRock.Visibility = Visibility.Visible;
    }

但是有一个错误错误*名称'UserimgRock'在当前上下文中不存在。我有点糊涂了。谢谢你的帮助!

更改图像对象可见性

如果这些xaml和后面的代码属于同一个类,那么只需在Name前面加上x:,其中x:指的是xaml的名称空间,通常在窗口标签中,如xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

<Image x:Name="UserimgRock" Source="Rock.png" HorizontalAlignment="Left" Height="100" Margin="277" VerticalAlignment="Top" Width="100" Visibility="Hidden"/>

如果这两者不在同一个类中,那么您可能无法使用事件处理程序来访问其他类中的对象,因为对象对各自的类来说是私有的。

编辑

在看了你的代码之后,我发现了一些事情,包括为什么你不能访问图像 的原因。

重要的事情先做,why you cannot access the image object?

的原因是,您在控制模板中定义了图像,这将对象的范围限制在模板本身,因此它们不能在

之外访问。

how to fix?

你可以在后面的代码中定义你需要访问的属性,并将它们绑定到xaml

中相应的属性

在usercontrol中定义一个依赖属性UserImgRockVisibility

   public Visibility UserImgRockVisibility
    {
        get { return (Visibility)GetValue(UserImgRockVisibilityProperty); }
        set { SetValue(UserImgRockVisibilityProperty, value); }
    }
    // Using a DependencyProperty as the backing store for UserImgRockVisibility.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty UserImgRockVisibilityProperty =
        DependencyProperty.Register("UserImgRockVisibility", typeof(Visibility), typeof(UserControl1), new PropertyMetadata(Visibility.Hidden));

在构造函数

中设置数据上下文为自身
        DataContext = this;

或在xaml中通过绑定到self

<UserControl x:Class="RockPaper.UserControl1"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"...
         DataContext="{Binding RelativeSource={RelativeSource Self}}">

然后使用此属性来操作可见性

        UserImgRockVisibility = Visibility.Visible;

最终将此属性绑定到xaml

中图像的可见性
        <Image x:Name="userimgRock" Visibility="{Binding UserImgRockVisibility}" ... />
如果您不需要

name,则不需要

这是为了控制控件模板或数据模板中对象的属性所需要的全部

另一种方法

因为我没有发现在用户控件

中使用样式和控件模板有什么意义

你可以通过简单地删除样式和控件模板元素,并将这些元素带到usercontrol

通过这样做,您可能不需要额外的属性,您可以简单地访问对象,因为它们将位于类作用域

我只看到你用它们来检测鼠标悬停,你可以在元素中使用事件触发器直接使用MouseEnter, MouseLeave之类的事件

,

<UserControl x:Class="RockPaper.UserControl1"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid>
        <Button x:Name="btnRock" Opacity=".3" HorizontalAlignment="Left" Margin="44,82.418,0,0" VerticalAlignment="Top" Width="100" Height="100" Click="btnRock_Click">
            <StackPanel>
                <Image />
            </StackPanel>
        </Button>
        <Image x:Name="userimgRock"  Visibility="Hidden" HorizontalAlignment="Left" Height="100" Margin="277.164,228.418,0,0" VerticalAlignment="Top" Width="100" Opacity="1" />
    </Grid>
    <UserControl.Triggers>
        <EventTrigger SourceName="btnRock" RoutedEvent="MouseEnter" >
            <BeginStoryboard>
                <Storyboard>
                    <DoubleAnimation x:Name="enter" To="1" Storyboard.TargetName="btnRock" Storyboard.TargetProperty="Opacity"/>
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
        <EventTrigger SourceName="btnRock" RoutedEvent="MouseLeave" >
            <BeginStoryboard>
                <Storyboard>
                    <DoubleAnimation To=".3" Storyboard.TargetName="btnRock" Storyboard.TargetProperty="Opacity"/>
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </UserControl.Triggers>
</UserControl>
注意我去掉了一些不必要的额外代码,例如

则通常使用图像对象作为

    userimgRock.Visibility = Visibility.Visible;

现在你可以选择你喜欢的了。两种都试试,看哪一种对你方便。