在WPF中,当创建对象作为资源时,如何“绑定”到通用属性?

时间:2017-11-02 15:21:39

标签: c# wpf xaml

我有一个“忙碌”的指示器,看起来像(并且有效):

<Grid x:Key="BusyIndicator" Visibility="Hidden" Opacity="0">
        <Grid.Style>
            <Style TargetType="{x:Type Grid}">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Path = IsBusy}" Value="True">
                        <DataTrigger.EnterActions>
                            <BeginStoryboard Storyboard="{StaticResource FadeInStoryboard}"/>
                        </DataTrigger.EnterActions>
                        <DataTrigger.ExitActions>
                            <BeginStoryboard Storyboard="{StaticResource FadeOutStoryboard}"/>
                        </DataTrigger.ExitActions>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </Grid.Style>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <Border Background="#90000000">
            <Image Width="25" Height="25" RenderTransformOrigin="0.5, 0.5">
                <Image.Source>
                    <BitmapImage UriSource="busy.png"/>
                </Image.Source>
                <Image.RenderTransform>
                    <RotateTransform Angle="0" />
                </Image.RenderTransform>
                <Image.Style>
                    <Style TargetType="{x:Type Image}">
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding Path = IsBusy}" Value="True">
                                <DataTrigger.EnterActions>
                                    <BeginStoryboard Storyboard="{StaticResource RotateStoryboard}"/>
                                </DataTrigger.EnterActions>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </Image.Style>
            </Image>
        </Border>
    </Grid>

如您所见,指标是一个“隐藏”和“不可见”的网格,当“IsBusy”属性发生变化时,网格会淡入,并显示一个旋转的“busy.png”图像。当“IsBusy”关闭时,指示灯再次淡化为“Invisible”,并消失。

这一切都有效。

我似乎无法解决这个问题,我如何将此控件作为App.xaml中的资源在整个应用程序中重用?因为它与IsBusy属性绑定,我发现自己不得不将这个怪物剪切并粘贴到需要使用指标的每个页面中。

有没有办法获得相同的效果,但有可重用的资源?

编辑:

所以它真的就像把它塞进UserControl一样简单。花了很多时间试图找到“WPF”解决方案,我忘记了基础知识。正如ASh所说,通过简单地在代码隐藏中添加依赖属性,使用页面中的控件现在看起来像这样:

<local:BusyIndicator IsBusy="{Binding Path=IsBusy}"/>

1 个答案:

答案 0 :(得分:0)

在这种情况下,具有bool依赖属性“IsBusy”的自定义UserControl(例如名为“BusyIndi​​cator”)看起来将是最简单的解决方案。然后你只需在xaml中插入<BusyIndicator/>并将IsBusy属性绑定到视图模型中的某个属性(不必命名为“IsBusy”):<BusyIndicator IsBusy="{Binding Path=IsBusyViewModelProperty}"/> - 并轻松自定义任何其他属性

This post可能会帮助您从现有资源

实施用户控件