WPF折叠VS重新绑定

时间:2015-11-06 16:25:13

标签: wpf performance rendering

我有以下代码,我能够重构:

<Grid Name="MainGrid">
                <Grid.ToolTip>
                    <TextBlock Name="Tt" Text="{Binding Path=ToolTip}" />
                </Grid.ToolTip>

                <StackPanel Orientation="Horizontal">
                    <TextBlock  x:Name="Error" Margin="0,0,5,0"  TextElement.FontWeight="Bold" TextElement.Foreground="Red"  Visibility="{Binding Path=Warning, Converter={StaticResource BooleanToVisibility}}" Text="!"/>
                    <Image x:Name="Icon" Source="../../icons\column.png" />
                    <TextBlock x:Name="tb" Margin="2,0,0,0" Text="{Binding Path=FieldName}" />
                </StackPanel>

            </Grid>
            <DataTemplate.Triggers>

                <MultiDataTrigger>
                    <MultiDataTrigger.Conditions>
                        <Condition Binding="{Binding Path=Published}" Value="False" />
                        <Condition Binding="{Binding Path=FieldMappingType}" Value="TempTable" />
                    </MultiDataTrigger.Conditions>
                    <Setter TargetName="tb" Property="FontStyle" Value="Italic" />
                </MultiDataTrigger>

                <DataTrigger Binding="{Binding Path=Active}" Value="False">
                    <Setter TargetName="MainGrid" Property="Opacity" Value="0.5" />
                </DataTrigger>

                <DataTrigger Binding="{Binding Path=IsPrimaryKey}" Value="True">
                    <Setter TargetName="tb" Property="Margin" Value="4,0,0,0" />
                    <Setter TargetName="Icon" Property="Source" Value="../../Icons/Key16.png" />
                </DataTrigger>

                <DataTrigger Binding="{Binding Path=FieldMappingType}" Value="TempTable">
                    <Setter TargetName="tb" Property="Margin" Value="4,0,0,0" />
                    <Setter TargetName="Icon" Property="Source" Value="../../Icons/tempTable.png" />
                </DataTrigger>

如您所见,有许多图像被折叠,然后根据对象的类型显示所需的图像。

我很欣赏这是一团糟,我以下列方式对其进行了重构:

sampleRadius

虽然我的重构更容易消化和更多的解释,但我想知道我是否通过更改单个图像的绑定而不是切换多个图像的可见性来获得更好的性能。

1 个答案:

答案 0 :(得分:0)

崩溃/显示而不是更改绑定总是更高效。如果应用程序真的在速度上挣扎,这是一个轻松的胜利。

原因是当更改绑定时,WPF必须重新生成整个可视树。这很慢。如果WPF正在折叠/显示可视树的一部分,那么它有一些有效的优化来使这个操作快速地进行。

具有讽刺意味的是,更改绑定直观地吸引程序员,而C#通常更容易阅读,更优雅。

更新

此规则仅适用于您正在销毁/创建巨大的可视树。如果您的应用程序速度非常慢,那么请将其视为优化,否则请避免因为通常需要更多的编程工作。