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