概述 UWP Community Toolkit Extensions 中有一个为FrameworkElement 提供的扩展 - FrameworkElement Extensions,本篇我们结合代码详细讲解 FrameworkElement Extensions 的实现。 FrameworkElement Extensions 为 FrameworkElement 提供了一种简单的绑定实际尺寸的方式,扩展利用 EnableActualSizeBinding 来指定是否允许实时绑定实际尺寸中的 Source: https://github.com/Microsoft/UWPCommunityToolkit/tree/master/Microsoft.Toolkit.Uwp.UI/Extensions/FrameworkElement DependencyObject sender, DependencyPropertyChangedEventArgs args) { var baseElement = sender as FrameworkElement
Silverlight 中的 UIElement 与 FrameworkElement 在 Silverlight 中, 有两个比较重要的基础控件 UIElement 和 FrameworkElement (FrameworkElement 为 Silverlight 布局中涉及的对象提供公共 API 的框架。 FrameworkElement 继承自 UIElement , 并添加了下面的功能: 1、 布局 (Layout) : 与 WPF 相似, 为了区别对待继承自 FrameworkElement 的类型 FrameworkElement 定义了生命周期事件 (Loaded/Unloaded) , 这些事件对后台代码来说是非常有用的。 4、 对象树 FrameworkElement 提供了 Parent 属性和 FindName 方法可以在对象树中分别向上和向下查找。
▲ 被切掉的椭圆 然而,因布局被“切掉”这一特性也是来自于 FrameworkElement! 然而 FrameworkElement 的切掉逻辑就复杂多了,鉴于有上百行,就只贴出链接 FrameworkElement.GetLayoutClip。其处理了各种布局、变换过程中的情况。 那么 FrameworkElement 做了什么呢? 屏幕交互 UIElement 中存在着布局计算,FrameworkElement 中存在着带限制的布局计算,这很容易让人以为屏幕相关的坐标计算会存在于 UIElement 或者 FrameworkElement 样式和模板 FrameworkElement 开始有了样式(Style),Control 开始有了模板(Template)。
Control = Controls as FrameworkElement; //要拖动的控件
FrameworkElement Thumb = sender as FrameworkElement FrameworkElement NewControl = new FrameworkElement();
bool IsDragAndDragSize = false; > ShowControlsList = new List<FrameworkElement>();
///
private FrameworkElement _root; // 获取当前窗口的根元素。 private FrameworkElement Root => _root ?? private static FrameworkElement FindRootVisual(FrameworkElement source) => (FrameworkElement)((HwndSource _root; private FrameworkElement Root => _root ?? (_root = FindRootVisual(this)); private static FrameworkElement FindRootVisual(FrameworkElement source) => (FrameworkElement)((HwndSource)PresentationSource.FromVisual(source)).RootVisual
string.IsNullOrEmpty(childName)) { var frameworkElement = child as FrameworkElement; // 如果控件名称符合参数条件 if (frameworkElement ! = null && frameworkElement.Name == childName) { foundChild FrameworkElement; // 如果控件名称符合参数条件 if (frameworkElement ! = null && frameworkElement.Name == childName) { list.Add(
Control = Controls as FrameworkElement; //要拖动的控件
FrameworkElement Thumb = sender as FrameworkElement FrameworkElement NewControl = new FrameworkElement();
bool IsDragAndDragSize = false; > ShowControlsList = new List<FrameworkElement>();
///
public static class CheckHit { public static bool CheckCollision(FrameworkElement control1, FrameworkElement controlElem1, FrameworkElement control2, FrameworkElement controlElem2) { // first see if return bCollision; } } private static bool CheckCollisionPoint(Point pt, FrameworkElement control, FrameworkElement controlElem) { if (controlElem is Image) { hits.Contains(controlElem)); } } private static WriteableBitmap GetWriteableBitmap(FrameworkElement
oldValue, FrameworkElement newValue) { if (oldValue ! element = obj as FrameworkElement; if (element == null) return; var headerProperty oldValue = (FrameworkElement)args.OldValue; FrameworkElement newValue = (FrameworkElement)args.NewValue AttachedElement { get { return (FrameworkElement)GetValue(AttachedElementProperty); } oldValue, FrameworkElement newValue) { if (oldValue !
frameworkElement) { if (e.NewValue is string rowName) { { return; } if (frameworkElement.Parent StringComparison.Ordinal)) { Grid.SetRow(frameworkElement frameworkElement) { if (e.NewValue is string columnName) StringComparison.Ordinal)) { Grid.SetColumn(frameworkElement
二、导出 WPF 界面元素的方法 首先给出能够导出任意 WPF 界面元素(FrameworkElement)为图片的方法,来源于网络,地址在方法注释中已给出,略作修改,代码如下: using System frameworkElement, string filePath, out string errorMsg) { try { , (int)frameworkElement.ActualHeight, 1 / 96, 1 / 96, PixelFormats.Default ); bmp.Render(frameworkElement); BitmapEncoder encoder = new TiffBitmapEncoder element = d as FrameworkElement; if (element == null) return;
本文是这一系列的第一篇,主要讨论FrameworkTemplate类和FrameworkElement的模板应用框架。 用代码工具我们可以看到,这个方法只在FrameworkElement.ApplyTemplate()里被调用了一次,这意味着这个方法是WPF可视化元素实现模板应用的唯一入口,其重要性无论如何强调都不为过 注意上面代码有一个语句: FrameworkTemplate template = TemplateInternal; 这说明FrameworkElement实际是根据其属性TemplateInternal 事实上,这个属性与另一个属性TemplateCache是有密切关系的,二者都是FrameworkTemplate类型,它们的定义如下: //***************FrameworkElement 现在问题是:FrameworkElement的子类具体是如何通过覆写虚属性TemplateInternal来自定义模板的?FrameworkTemplate的三个子类的变量有哪些?
OnApplyTemplate() { base.OnApplyTemplate(); _headerPart = GetTemplateChild(HeaderPartName) as FrameworkElement button.Click += OnButtonClick; } } 2.3 完整的代码 [TemplatePart(Name = HeaderPartName, Type = typeof(FrameworkElement 只有代码中执行了_headerPart = GetTemplateChild(HeaderPartName) as FrameworkElement这句后,VisualTree上才可以看到HeaderContentPresenter 上面的ContentView代码中即包含这个协定: [TemplatePart(Name = HeaderPartName, Type = typeof(FrameworkElement))] 这段代码的意思是期待在 ControlTemplate中存在名称为 "HeaderContentPresenter",类型为FrameworkElement的部件。
这里我们仅研究FrameworkElement的Triggers。 所以我们从实现上了解到了FrameworkElement的Triggers仅支持EventTrigger FrameworkElement在初始化的时候会调用EventTrigger的ProcessTriggerCollection ( FrameworkElement triggersHost )方法,针对集合中的每一个事件,为FrameworkElement添加监听器,而在事件触发时,引发监听器的Handler,使EventTrigger 比如说在 SoundPlayerAction中就实现了如下工作 internal sealed override void Invoke(FrameworkElement el) {
string.IsNullOrEmpty(childName)) { var frameworkElement = child as FrameworkElement; // 看名字是不是一样 if (frameworkElement ! = null && frameworkElement.Name == childName) { //如果名字一样返回
的控件,代码如下 class F1 : FrameworkElement { public F1() { Width = 500; Height = 500 这里的 F2 子控件,也是一个继承 FrameworkElement 的类型,代码定义如下 class F2 : FrameworkElement { public F2() { 这个时候咱依然可以继承 FrameworkElement 来进行自己编写。 默认 WPF 在 FrameworkElement 将会自动裁剪超过布局传入尺寸的画面。 对于继承 FrameworkElement 元素的控件来说,默认 WPF 将会自动裁剪超过布局传入尺寸的画面,除非重写 GetLayoutClip 修改行为。
private void Rectangle_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { FrameworkElement element = sender as FrameworkElement; mousePosition = e.GetPosition(element); } private void Rectangle_MouseMove(object sender, MouseEventArgs e) { FrameworkElement element = sender as FrameworkElement; if (trackingMouseMove) { double deltaV = e.GetPosition element = sender as FrameworkElement; trackingMouseMove = false; element.ReleaseMouseCapture
{ // Retrieve the TextBlock that will hold new file name FrameworkElement } } } } } private static FrameworkElement { DependencyObject child = VisualTreeHelper.GetChild(control, i); FrameworkElement element = child as FrameworkElement; if (element !
老方法,先看定义: [TemplatePartAttribute(Name = "PART_Track", Type = typeof(FrameworkElement ))] [TemplatePartAttribute(Name = "PART_Indicator", Type = typeof(FrameworkElement))] public class ProgressBar : RangeBase 从类定义中看到,ProgressBar控件的模板有两个部分,我们在定义模板的时候用什么都可以,上面的定义指定是FrameworkElement ,因此,只要是继承自FrameworkElement的都可以作为模板的一部分,重点是Name属性一定要和每个部分的名称对应,也就是说你定义的模板部件必须为PART_Track和PART_Indicator
里加上这段: <TextBlock.RenderTransform> <TranslateTransform Y="-90" /> </TextBlock.RenderTransform> <FrameworkElement.Triggers > <EventTrigger RoutedEvent="<em>FrameworkElement</em>.Loaded"> <BeginStoryboard> <Storyboard </DoubleAnimation> </Storyboard> </BeginStoryboard> </EventTrigger> </FrameworkElement.Triggers TextBlock.Foreground> <TextBlock.RenderTransform> <TranslateTransform /> </TextBlock.RenderTransform> <FrameworkElement.Triggers > <EventTrigger RoutedEvent="<em>FrameworkElement</em>.Loaded"> <BeginStoryboard> <Storyboard