WPF转换器行为不清楚

时间:2016-04-14 12:08:26

标签: c# wpf converter

我尝试制作导航器,显示ScrollViewer Content的缩略图。我的应用程序有工作区,我放置对象,我想在导航器中显示:

<local:WorkArea x:Name="WorkArea" Grid.Row="1"/>

工作区是UserControl,具有以下结构:

<UserControl>
     <ScrollViewer>
          <Canvas/>
     <ScrollViewer/>
<UserControl/>

我的导航器也是UserControl

<local:Navigator DataContext="{Binding ElementName=WorkArea, Path=Content}"
                 HorizontalAlignment="Right" VerticalAlignment="Bottom"
                 Width="250" Height="250" Margin="0,0,10,10" Grid.Row="1"/>

它的结构:

<UserControl x:Class="DbCreator.Navigator"
             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"
             xmlns:local="clr-namespace:DbCreator"
             mc:Ignorable="d" Opacity="0.9"
             d:DesignHeight="300" d:DesignWidth="300">
<UserControl.Resources>
    <local:WorkAreaToNavigatorConverter x:Key="WorkAreaToNavigatorConverter"/>
</UserControl.Resources>
<Border BorderBrush="#757575" BorderThickness="1"
        HorizontalAlignment="Right" VerticalAlignment="Bottom"
        Width="{Binding ElementName=ViewBox, Path=ActualWidth}"
        Height="{Binding ElementName=ViewBox, Path=ActualHeight}">
    <Viewbox x:Name="ViewBox" Width="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}, Path=ActualWidth}"
             Height="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}, Path=ActualHeight}">
        <Grid Background="White">
            <Rectangle Width="{Binding Content.ActualWidth}"
                       Height="{Binding Content.ActualHeight}"
                       Name="Thumbnail">
                <Rectangle.Fill>
                    <VisualBrush Visual="{Binding Content, Converter={StaticResource WorkAreaToNavigatorConverter}}"/>
                </Rectangle.Fill>
            </Rectangle>
            <Border Background="#20000000" x:Name="ViewPort" Cursor="SizeAll"
                    Width="{Binding ViewportWidth}" Height="{Binding ViewportHeight}"
                    MaxWidth="{Binding Content.ActualWidth}" MaxHeight="{Binding Content.ActualHeight}"
                    HorizontalAlignment="Left" VerticalAlignment="Top"
                    MouseDown="Border_MouseDown"
                    MouseUp="Border_MouseUp"
                    MouseMove="Border_MouseMove">
                <Border.RenderTransform>
                    <TranslateTransform X="{Binding HorizontalOffset}" Y="{Binding VerticalOffset}"/>
                </Border.RenderTransform>
            </Border>
        </Grid>
    </Viewbox>
</Border>

因此,我将工作区的内容(ScrollViewer)绑定到导航器的DataContextRectangle内的Viewbox代表工作区&#39; Canvas的缩略图。我使用Rectangle填充VisualBrushCanvas绑定到工作区Canvas。没有转换器,我有这个:

Without converter

我想将工作区的Canvas转换为另一个WorkAreaToNavigatorConverter,它没有网格线并且包含矩形而不是表格。所以我写了public class WorkAreaToNavigatorConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { Canvas workAreaCanvas = value as Canvas; Canvas canvas = new Canvas() { Width = workAreaCanvas.ActualWidth, Height = workAreaCanvas.ActualHeight, Background = new SolidColorBrush(Colors.White) }; foreach (Table table in workAreaCanvas.Children.OfType<Table>()) { Rectangle rectangle = new Rectangle() { Width = table.ActualWidth, Height = table.ActualHeight, Fill = new SolidColorBrush((Color)ColorConverter.ConvertFromString((string)table.Tag)) }; Canvas.SetLeft(rectangle, Canvas.GetLeft(table)); Canvas.SetTop(rectangle, Canvas.GetTop(table)); Canvas.SetZIndex(rectangle, Canvas.GetZIndex(table)); canvas.Children.Add(rectangle); } return canvas; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { return DependencyProperty.UnsetValue; } }

Convert

return canvas方法仅在应用程序开始时调用一次。有趣的是,如果我将return value替换为enum,它就像没有转换器一样工作,就像它在返回之前跳过代码一样。 为什么转换器不起作用?我该怎么办?

0 个答案:

没有答案