相关疑难解决方法(0)

在WPF中使用MVVM将n个矩形添加到画布

我想在我的mvvm应用程序的主窗口中添加一组矩形.在我的viewModel中,我有一个对象集合,我用转换器转换为System.Windows.Shapes.Rectangle类(代码如下):

视图模型:

RecognizedValueViewModel 
{
    public ObservableCollection<BarcodeElement> BarcodeElements
    {
        get { return _BarcodeElements; }
        set { _BarcodeElements = value; }
    }

    public RecognizedValueViewModel()
    {
        BarcodeElements = InitializeBarcodeElements();
    }
}
Run Code Online (Sandbox Code Playgroud)

转换器:

public BarcodeElementToRectangleConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        Rectangle barcodeRectangle = GetRectangleFromBarcodeElement(value as BarcodeElement);

        return barcodeRectangle;
    }
}
Run Code Online (Sandbox Code Playgroud)

矩形应显示在MainWindow的画布中:

<Canvas x:Name="Canvas_Image_Main">
    <!-- Show rectangles here -->
</Canvas>
Run Code Online (Sandbox Code Playgroud)

我会在代码中将Rectangles添加到canvas中,但我现在还没有在运行时有多少个矩形.我有办法实现这个目标吗?保护你.

c# wpf user-interface canvas mvvm

17
推荐指数
2
解决办法
2万
查看次数

使附加属性在 DataTemplate 中工作

我得到了一个ItemsControl使用Canvasas 的项目ItemsPanel,它的项目根据绑定类型呈现为不同的 WPF 形状,基本上如下所示:

<ItemsControl  ItemsSource="{Binding PreviewShapes}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
    <ItemsControl.Resources>
        <DataTemplate DataType="{x:Type local:UiPreviewLineViewModel}">
            <Line X1="{Binding Start.X}" Y1="{Binding Start.Y}"
                        X2="{Binding End.X}" Y2="{Binding End.Y}" 
                        StrokeThickness="0.75" Stroke="{Binding Brush}" x:Name="Line" ToolTip="{Binding Text}">
            </Line>
        </DataTemplate>
        <DataTemplate DataType="{x:Type local:UiPreviewEllipsisViewModel}">
            <Ellipse Canvas.Left="{Binding UpperLeft.X" Canvas.Top="{Binding UpperLeft.Y}" 
                     Width="{Binding Width}" Height="{Binding Height}" 
                     StrokeThickness="0.75" Stroke="{Binding Brush}" x:Name="Ellipse" ToolTip="{Binding Text}">
            </Ellipse>
        </DataTemplate>
    </ItemsControl.Resources>
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Canvas IsItemsHost="True" HorizontalAlignment="Center" VerticalAlignment="Center" x:Name="SketchCanvas" ClipToBounds="False">
            </Canvas>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>
Run Code Online (Sandbox Code Playgroud)

因此,我基本上将对象添加到PreviewShapes视图模型中,并根据它们渲染到 WPFLineEllipses 的类型。这基本上可以工作,但附加的属性Canvas.Left和 …

wpf datatemplate attached-properties

4
推荐指数
1
解决办法
1890
查看次数