wpf使相同的控件出现在两个不同的地方

时间:2014-06-30 07:19:01

标签: c# wpf parent-child duplicate-data

在wpf中,我有一个画布,当双击时,需要在单独的选项卡中打开以进行编辑。切换标签时,我需要能够在原始位置看到画布,并应用更改。 是否有一个技巧使它成为两个TabItems的孩子?如果没有,还有什么我可以做的吗? 谢谢!

2 个答案:

答案 0 :(得分:0)

有很多可能性:

  • 使用MVVM架构,然后您可以在不同的视图中绑定相同的数据。

  • 将父属性更改为您的控件。

  • 克隆控件。

  • 使用屏幕截图伪造克隆。

例如拍摄控件的屏幕截图:

    public static BitmapSource SnapShotToBitmap(this UIElement source, double zoomX, double zoomY)
    {
        try
        {
            DataObject dataObject = new DataObject();

            double actualHeight = source.RenderSize.Height;
            double actualWidth = source.RenderSize.Width;

            if (actualHeight == 0)
                actualHeight = 1;
            if (actualWidth == 0)
                actualWidth = 1;

            double renderHeight = actualHeight * zoomY;
            double renderWidth = actualWidth * zoomX;

            RenderTargetBitmap renderTarget = new RenderTargetBitmap((int)renderWidth, (int)renderHeight, 96, 96, PixelFormats.Pbgra32);
            VisualBrush sourceBrush = new VisualBrush(source);

            DrawingVisual drawingVisual = new DrawingVisual();
            DrawingContext drawingContext = drawingVisual.RenderOpen();

            using (drawingContext)
            {
                drawingContext.PushTransform(new ScaleTransform(zoomX, zoomY));
                drawingContext.DrawRectangle(sourceBrush, null, new Rect(new Point(0, 0), new Point(actualWidth, actualHeight)));
            }
            renderTarget.Render(drawingVisual);

            return renderTarget;
        }
        catch (Exception e)
        {
            throw new Exception(e);
        }
    }

答案 1 :(得分:0)

MVVM解决方案相当容易。

public class KeyboardViewModel : INotifyPropertyChanged
{
    private ObservableCollection<ToolItemViewModel> _toolItems;

    public ObservableCollection<ToolItemViewModel> ToolItems
    {
        get { return _toolItems; }
        set
        {
            _toolItems = value;
            OnPropertyChanged("ToolItems");
        }
    }

    [field: NonSerialized]
    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }

    public ToolItemViewModel AddToolItem()
    {
        ToolItemViewModel item = new ToolItemViewModel();
        ToolItems.Add(item);
        return item;
    }
}

public class ToolItemViewModel : INotifyPropertyChanged
{
    private string _tooltip;

    public string Tooltip
    {
        get { return _tooltip; }
        set
        {
            _tooltip = value;
            OnPropertyChanged("Tooltip");
        }
    }


    [field: NonSerialized]
    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

基本上在代码的某处,您可以传递您正在使用的实例作为参数,并且将同步使用该实例的任何视图。

MVVM是你真正应该学习的东西,以便有效地使用WPF。