我正在尝试将控件从一个父母移动到另一个父母(如果这样可行,我不太确定).我可以掌握我想要移动的控件.这是我的代码:
public void MoveElement(UIElement uiElement)
{
var element = ((FrameworkElement)uiElement).Parent;
//TODO:Remove from parent
myControl.Children.Add(uiElement);
}
Run Code Online (Sandbox Code Playgroud)
当我点击最后一个语句时,抛出ArgumentException,指出"指定的Visual已经是另一个Visual的子项或CompositionTarget的根".奇怪的是,Parent返回null.如何找到父母?这甚至会起作用吗?
编辑:我不认为实际移动元素是我的问题的答案.我正在使用Visual Studio SDK,并且能够掌握UIElement
组成编辑器窗格(扩展DockPanel
)的内容.我试图将控件从标准编辑器移动到我正在开发的自定义工具窗口中.
这被证明是一个黑客,我意识到我需要同一控件的多个实例,所以我认为一个更复杂的解决方案(而不是一个黑客)存储.
我不清楚你何时会使用a UIElement
而不是a FrameworkElement
,为什么会有一个FrameworkElement
类.从本质上讲,FrameworkElement
提供的额外功能是什么,而不是UIElement
?
我有一个图表,我正在向用户显示,我希望能够将图表作为图像导出到磁盘,以便他们可以在应用程序之外使用它(用于演示文稿或其他东西).
我已经设法使用PngBitmapEncoder和RenderTargetBitmap来获得基本的想法,但我得到的图像是小到可以使用的方式,我希望得到更大的图像.
我试图简单地增加我想要渲染的控件的高度和宽度,但是父级似乎可以直接控制渲染大小.从这里我试图在内存中复制UIElement但是然后渲染大小为(0,0)并且当我尝试使用方法来渲染它时,例如Measure()Arrange()和UpdateLayout()它们会抛出异常需要解耦父级来调用它们,但因为它在内存中而不是渲染,所以不应该是父级?
这一切都是使用Visiblox图表API完成的
这是我目前所拥有的,除了它不起作用:(
var width = 1600;
var height = 1200;
var newChart = new Chart { Width = width, Height = height, Title = chart.Title, XAxis = chart.XAxis, YAxis = chart.YAxis, Series = chart.Series};
Debug.WriteLine(newChart.RenderSize);
var size = new Size(width, height);
newChart.Measure(size);
newChart.Arrange(new Rect(size));
newChart.UpdateLayout();
Debug.WriteLine(newChart.RenderSize);
var rtb = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Pbgra32);
rtb.Render(newChart);
var encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(rtb));
using (var stream = fileDialog.OpenFile())
encoder.Save(stream);
Run Code Online (Sandbox Code Playgroud)
我已经离得更近了,它现在将图形背景渲染为轴'等等,但不是实际绘制的线条.以下是更新的来源
public static void RenderChartToImage(Chart elementToRender, string filename)
{ …
Run Code Online (Sandbox Code Playgroud) 我有一个自定义面板,用于绘制选择效果; 但有时它不能清除以前的矩形,如果鼠标在屏幕足够大时来回移动(跨两个监视器),是WPF错误还是限制?你知道如何解决这个问题吗?提前致谢.
简化代码如下所示
public class CustomPanel : Panel
{
private Rectangle _rectangle;
public CustomPanel()
{
this._rectangle = new Rectangle();
this._rectangle.StrokeThickness = 3;
this._rectangle.Stroke = new SolidColorBrush(Color.FromArgb(220, 0, 0, 0)); ;
this.Children.Add(this._rectangle);
}
protected override Size MeasureOverride(Size availableSize)
{
this._rectangle.Measure(availableSize);
return this._rectangle.DesiredSize;
}
protected override Size ArrangeOverride(Size finalSize)
{
if (!finalSize.IsEmpty)
{
this._rectangle.Arrange(new Rect(new Point(0, 0), finalSize));
}
return finalSize;
}
}
Run Code Online (Sandbox Code Playgroud)
我把它放在网格中并在鼠标移动过程中使其无效,就像这样
void OnMouseMove(object sender, MouseEventArgs e)
{
var point = e.GetPosition(this);
var size = new Size(point.X>=0? point.X:0, point.Y>=0? point.Y:0); …
Run Code Online (Sandbox Code Playgroud) 我首先尝试了这种方法,但得到错误"元素已经是另一个元素的孩子"
var objClone = new MyImageControl();
objClone = this;
((Canvas)this.Parent).Children.Add(objClone);
Run Code Online (Sandbox Code Playgroud)
然后我检查这个和这个,但的XamlWriter和XamlReader不可在WinRT中.我试图使用MemberwiseClone()但它抛出异常,"不能使用已与其底层RCW分离的COM对象.System.Runtime.InteropServices.InvalidComObjectException
" 那么有谁能告诉我如何将画布中的现有UserControl克隆到自身?
我们在类库中定义了一个名为FixedToolBar的自定义控件,该库由第二个程序集引用,该程序集通过XAML使用它.但是,VS2015显示错误:
类型为FixedToolBar的值无法添加到"UIElementCollection"类型的集合或字典中
这是班级本身
public class FixedToolBar : Control // <-- Control is a subclass of UIElement
{
// Bla bla
}
Run Code Online (Sandbox Code Playgroud)
......这是XAML片段......
<DockPanel>
<c:FixedToolBar x:Name="MainToolBar" DockPanel.Dock="Top">
<Button Header="Test 1" />
<Button Header="Test 2" />
</c:FixedToolBar>
<ListBox x:Name="MainListBox" />
</DockPanel>
Run Code Online (Sandbox Code Playgroud)
更奇怪的是它只显示XAML编辑器打开时的错误,但否则编译并运行就好了!
有什么想法吗?让VS在设计时报告所有这些错误真的很烦人.所有那些红色波浪形使得XAML da @ n几乎不可读!
我有一个包含任意数量的列表框 UIElement
大小未知s。
我希望能够在添加每个项目后跟踪列表框的建议大小。这将允许我将一个大列表(例如:100 个项目)拆分为几个(例如:10)个大致相同视觉效果的较小列表大小,而不管列表中每个元素的视觉大小。
但是,似乎 Measure 传递仅在第一次调用 Measure 时影响ListBox
的DesiredSize
属性:
public partial class TestWindow : Window
{
public TestWindow()
{
InitializeComponent();
ListBox listBox = new ListBox();
this.Content = listBox;
// Add the first item
listBox.Items.Add("a"); // Add an item (this may be a UIElement of random height)
listBox.Measure(new Size(double.MaxValue, double.MaxValue)); // Measure the list box after the item has been added
Size size1 = listBox.DesiredSize; // reference to the size the ListBox "wants" …
Run Code Online (Sandbox Code Playgroud) 我正在制作各种尺寸的UI元素(WPF)的屏幕截图,我可以使用"RenderTargetBitmap"实现这一点.但是UIElement
有Adorner
一部分不会在复制时出现.我该怎么做才能实现这一点.任何参考或代码片段?
在使用UIElement
C#编写UWP程序时,我正在使用从类派生的类,其中我想要包括处理输入控件,如鼠标和键盘操作.现在我看到已经有虚拟方法OnSomeEvent()
说明了我可以覆盖这些方法以适应我的处理过程,或者我可以创建处理基类中定义的公共事件的新方法,并在构造函数中将它们订阅到这些输入事件.我认为这两种方法都有效但我希望知道哪种方法更专业或更明智,以及为什么.此外,它有助于解释为什么MS同时提供这两种方式.
这是UIElement
类
https://msdn.microsoft.com/en-us/library/system.windows.uielement(v=vs.110).aspx#Examples的事件和方法.
和一段引用
UIElement为元素布局特征提供了一个起点,并且还公开了派生类可以覆盖的虚拟方法,这些方法可以影响元素及其子元素的布局呈现行为.通常,元素的大部分输入和聚焦行为也在UIElement类中定义.这包括键盘,鼠标和手写笔输入的事件以及相关的状态属性.其中许多事件都是路由事件,许多与输入相关的事件都有冒泡路由版本以及事件的隧道版本.这些配对事件通常是控制作者最感兴趣的事件.