Silverlight 在运行时更改 ControlTemplate

You cannot create a ControlTemplate in Silverlight in C# alone. Unlike WPF (where you can set the VisualTree property), there is no property you can set that specifies the "content" of the ControlTemplate.

You can define your XAML as a string, and then load that dynamically in C# as explained by this blog post.

The code boils down to:

var template = (ControlTemplate)XamlReader.Load("<ControlTemplate " +
       " xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"" +
       " xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">" +
       " content here " +
       "</ControlTemplate>");

这是在 stackoverflow 找到的回答。XamlReader.Load(string xaml),这个xaml有限制,不能写 x:Name ,例如“<ControlTemplate x:Name=\"ctName\",这样写运行时报错。我找到的解决办法:

建立资源文件,将需要运行时修改的设计代码写入资源文件中。例如:

<?xml version="1.0" encoding="utf-8"?>
<esri:SimpleFillSymbol
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:esri="http://schemas.esri.com/arcgis/client/2009"
                       >
    <esri:SimpleFillSymbol.ControlTemplate>
        <ControlTemplate>
            <Path x:Name="Element" Fill="Red" Stroke="White" StrokeThickness="0.4"
                              Cursor="Hand">
                <VisualStateManager.VisualStateGroups>
                    <VisualStateGroup x:Name="SelectionStates">
                        <VisualState x:Name="Unselected">
                            <Storyboard>
                                <ColorAnimation Storyboard.TargetName="Element"
                                                            Storyboard.TargetProperty="(Path.Stroke).(SolidColorBrush.Color)"
                                                            To="White" Duration="0:0:.25" />
                                <DoubleAnimation Storyboard.TargetName="Element"
                                                             Storyboard.TargetProperty="StrokeThickness"
                                                             To="0.4" Duration="00:00:.25" />
                                <DoubleAnimation Storyboard.TargetName="Element"
                                                             Storyboard.TargetProperty="Opacity"
                                                             To="0.5" Duration="00:00:.25" />
                            </Storyboard>
                        </VisualState>

                        <VisualState x:Name="Selected">
                            <Storyboard>
                                <ColorAnimation Storyboard.TargetName="Element"
                                                            Storyboard.TargetProperty="(Path.Stroke).(SolidColorBrush.Color)"
                                                            To="Black" Duration="0:0:.25" />
                                <DoubleAnimation Storyboard.TargetName="Element"
                                                             Storyboard.TargetProperty="StrokeThickness"
                                                             To="3" Duration="00:00:.25" />
                                <DoubleAnimation Storyboard.TargetName="Element"
                                                             Storyboard.TargetProperty="Opacity"
                                                             To="1" Duration="00:00:.25" />
                            </Storyboard>
                        </VisualState>
                    </VisualStateGroup>
                </VisualStateManager.VisualStateGroups>
            </Path>
        </ControlTemplate>
    </esri:SimpleFillSymbol.ControlTemplate>
</esri:SimpleFillSymbol>

我需要运行时修改 Fill="Red" ,这个颜色。建立资源文件:ArcFill.xaml,将代码写入,设置 ArcFill.xaml 的属性:生成操作 为 嵌入的资源,以供读取使用。

读取资源文件:

StreamReader reader = new StreamReader(System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("StMap.Resource.ArcFill.xaml"));
string strArcFill = reader.ReadToEnd();SimpleFillSymbol sfs = XamlReader.Load(strArcFill) as SimpleFillSymbol;

资源文件文件中虽然包括了x:Name,但这样 XamlReader.Load 读取却没有任何问题。如果想改变颜色:

 XamlReader.Load(strArcFill.Replace("Red", "Green")) as SimpleFillSymbol

这样直接查找替换,工作的很 OK,红色成功变成了绿色,完整的测试用代码:

            StreamReader reader = new StreamReader(System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("StMap.Resource.ArcFill.xaml"));
            string strArcFill = reader.ReadToEnd();

            ClassBreaksRenderer newClassBreaksRenderer = new ClassBreaksRenderer();
            newClassBreaksRenderer.Field = "投诉量";

            newClassBreaksRenderer.Classes.Add(new ClassBreakInfo()
            {
                MinimumValue = 0,
                MaximumValue = 250,
                Symbol = XamlReader.Load(strArcFill.Replace("Red", "Blue")) as SimpleFillSymbol
            });

            newClassBreaksRenderer.Classes.Add(new ClassBreakInfo()
            {
                MaximumValue = 500,
                Symbol = XamlReader.Load(strArcFill.Replace("Red", "Green")) as SimpleFillSymbol
            });

            newClassBreaksRenderer.Classes.Add(new ClassBreakInfo()
            {
                MaximumValue = 750,
                Symbol = XamlReader.Load(strArcFill.Replace("Red", "Goldenrod")) as SimpleFillSymbol
            });

            PictureMarkerSymbol p = new PictureMarkerSymbol();

            newClassBreaksRenderer.Classes.Add(new ClassBreakInfo()
            {
                MaximumValue = 1000,
                Symbol = XamlReader.Load(strArcFill.Replace("Red", "DarkOrchid")) as SimpleFillSymbol
            });

            newClassBreaksRenderer.Classes.Add(new ClassBreakInfo()
            {
                MaximumValue = 9999999,
                Symbol = XamlReader.Load(strArcFill.Replace("Red", "Red")) as SimpleFillSymbol
            });

            GraphicsLayer graphicsLayer = MyMap.Layers["CY_L1"] as GraphicsLayer;
            graphicsLayer.Renderer = newClassBreaksRenderer;

效果图:

时间: 2024-09-28 06:59:05

Silverlight 在运行时更改 ControlTemplate的相关文章

如何在运行时更改JMeter的负载

在某些情况下,能够在不停止测试的情况下更改性能测试产生的负载是有用的或必要的.这可以通过使用Apache JMeter™的恒定吞吐量计时器和Beanshell服务器来完成.在这篇文章中,我们将介绍如何实现这一点,同时提供示例. 在性能测试场景中,负载主要由访问正在测试的应用程序的虚拟用户数量来定义.在JMeter中,虚拟用户实现为线程.其他可以定义测试负载的参数或变量是测试持续时间,思考时间和上升周期.在这篇文章中,我们将要改变的load参数是吞吐量,通过Constant Throughput

Android实例-Delphi在运行时更改Android屏幕旋转(IOS也支持,但还没有写,下午我回来加上。不过我可没有苹果机,测试不了)

相关资料: https://www.it1352.com/624177.html 1 unit Unit2; 2 3 interface 4 5 uses 6 System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, 7 FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMXTee.Engine, 8 FMXTee.P

Android运行时配置更改

Android支持在运行时更改语言,位置.硬件.它是通过终止和重启activity来实现上诉功能的.可起到强制重新评估activity中使用的资源的分辨率,并为心得配置选择最合适的资源值. 要让activity可以监听运行时配置更改,需要向它的manifest节点中添加一个android:configChanges属性来说明希望对哪些配置更改进行处理 下面的列表描述了可以指定的运行时更改: mcc和mnc    检测到sim,并且与之关联的国家或者网络的代码发生了变化 locale    用户改

RTTI (Run-Time Type Identification,通过运行时类型识别) 转

参考一: RTTI(Run-Time Type Identification,通过运行时类型识别)程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型. RTTI提供了以下两个非常有用的操作符: (1)typeid操作符,返回指针和引用所指的实际类型: (2)dynamic_cast操作符,将基类类型的指针或引用安全地转换为派生类型的指针或引用. 面向对象的编程语言,象C++,Java,delphi都提供了对RTTI的支持. 本文将简略介绍 RTTI 的一些背景知识.描述 R

Silverlight运行时提示未安装silverlight runtime 解决方法

出现该问题是由于电脑上安装的silverlight不是silverlight developer. 一般来说安装完VS之后是不会出现该问题. 但是一旦更改了silverlight中web service中TestPage的minRuntimeVersion版本,因为默认生成的版本号是silverlight sdk(根据创建项目时选择的是silverlight 4还是5来判断是哪个版本的SDK)的版本号.一旦修改的版本号比电脑安装的sdk版本高,则会在第一次运行时提示需要安装更新版本的silver

java-基础入门-泛型数组列表-解决运行时动态更改数组的问题

泛型数组列表,主要是为了解决运行时动态更改数组的问题 平常我们会定义一个部门里面的人员的一个数组, 但是在实际业务当中,这个数组的大小往往是不确定的, 如果定义过大,那么会浪费空间,定义过小,又不够用, 因为为了解决运行时动态更改数组的问题,我们提出下面的解决方案. package com.ray.object; import java.util.ArrayList; /** * 泛型数组列表 ,解决运行时动态更改数组的问题 * * @author ray * @since 2015-05-04

无法启动调试。未安装Silverlight Developer运行时。最新运行时可以从以下地址下载: http://go.microsoft.com/fwlink/?LinkId=146060.

无法启动调试.未安装Silverlight Developer运行时.最新运行时可以从以下地址下载: http://go.microsoft.com/fwlink/?LinkId=146060. 解决方法: 先卸载Microsoft Silverlight, 然后再次安装改程序Silverlight_Developer.exe.

Android处理运行时变更保存数据状态恢复Activity

一.概述 运行时变更就是设备在运行时发生变化(例如屏幕旋转.键盘可用性及语言).发生这些变化,Android会重启Activity,这时就需要保存activity的状态及与activity相关的任务,以便恢复activity的状态. 为此,google提供了三种解决方案: 对于少量数据: 通过onSaveInstanceState(),保存有关应用状态的数据. 然后在 onCreate() 或 onRestoreInstanceState() 期间恢复 Activity 状态. 对于大量数据:用

iOS开发——高级特性&amp;Runtime运行时特性详解

Runtime运行时特性详解 本文详细整理了 Cocoa 的 Runtime 系统的知识,它使得 Objective-C 如虎添翼,具备了灵活的动态特性,使这门古老的语言焕发生机.主要内容如下: 引言 简介 与Runtime交互 Runtime术语 消息 动态方法解析 消息转发 健壮的实例变量(Non Fragile ivars) Objective-C Associated Objects Method Swizzling 总结 引言 曾经觉得Objc特别方便上手,面对着 Cocoa 中大量