- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个按钮,可以从文件加载 XAML,从中创建一个控件,并将此控件作为子控件添加到 Canvas 中,该 Canvas 是窗口停靠面板资源中存在的模板的一部分。该窗口还有一个名为 cboTColour 的组合框和一个名为 cboBColour 的组合框,我用它们在加载的控件上设置简单的渐变背景。
我使用以下代码加载 XAML 并将其添加到我的 Canvas 中:
XmlReader xaml = XmlReader.Create(filename);
newControl = (Viewbox)XamlReader.Load(xaml);
((Canvas)(testButton.Template.FindName("MyCanvas", testButton))).Children.Clear();
((Canvas)(testButton.Template.FindName("MyCanvas", testButton))).Children.Add(newControl);
这是我加载的 XAML:
<?xml version="1.0" encoding="utf-8"?>
<Viewbox xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Name="Document" Stretch="Fill">
<Canvas Height="64" Width="128" ClipToBounds="True">
<Canvas.Background>
<!--Horizontal Gradient-->
<LinearGradientBrush StartPoint="1,0">
<GradientStop Color="{Binding ElementName=cboTColour, Path=SelectedItem.Name}" Offset="0"></GradientStop>
<GradientStop Color="{Binding ElementName=cboBColour, Path=SelectedItem.Name}" Offset="1"></GradientStop>
</LinearGradientBrush>
</Canvas.Background>
</Canvas>
</Viewbox>
我已经尝试将 XAML 直接放入设计器中并且它工作得很好,所以这不是问题。当我从文件加载 XAML 时,正在正确创建和放置控件,但数据绑定(bind)不起作用 - 颜色没有改变。我收到以下错误:
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=cboTColour'. BindingExpression:Path=SelectedItem.Name; DataItem=null; target element is 'GradientStop' (HashCode=24393646); target property is 'Color' (type 'Color')
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=cboBColour'. BindingExpression:Path=SelectedItem.Name; DataItem=null; target element is 'GradientStop' (HashCode=23972246); target property is 'Color' (type 'Color')
我假设发生的事情是当 XAMLReader 加载 xaml 广告并从中创建一个控件时,它不确定到我的组合框的路径,因为 xaml 还不是窗口的一部分,并且当控件是添加到窗口后,此绑定(bind)不会更新,但我不知道如何修改 XAML 中的绑定(bind)以反射(reflect)我的组合框相对于它的位置或修改 XAMLReader 或整体数据上下文以获取考虑到我的控制。我还可以向您保证,此时已创建组合框,因为当在组合框所在的窗口上按下按钮时代码会运行。
我必须指定我不能在代码中修改绑定(bind)本身,因为绑定(bind)将出现在我将加载的不同 XAML 文件中的不同位置和不同时间。
如有任何帮助,我们将不胜感激。
最佳答案
看起来 XamlReader 对其加载的 xaml 进行了限制,因此它不能包含未在加载的 xml 中定义的未知元素名称。而是使用数据绑定(bind)到工作正常但需要一些代码的属性。当用户更改组合框的选定项目时,下面的代码将更改加载控件的背景。您需要添加一个值转换器,将颜色转换为供组合框使用的人类可读名称。
XAML:
<StackPanel>
<ComboBox
ItemsSource="{Binding Path=AvailableColors}"
SelectedValuePath="Color"
SelectedValue="{Binding Path=SelectedColors[color0].Color}" />
<ComboBox
ItemsSource="{Binding Path=AvailableColors}"
SelectedValuePath="Color"
SelectedValue="{Binding Path=SelectedColors[color1].Color}" />
<ContentControl Name="newControl" />
</StackPanel>
代码隐藏:
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Windows;
using System.Windows.Markup;
using System.Windows.Media;
using System.Xml;
namespace LoadTest
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
SelectedColors = new Dictionary<string, ColorInfo>();
SelectedColors.Add("color0", AvailableColors.First());
SelectedColors.Add("color1", AvailableColors.Last());
XmlReader xaml = XmlReader.Create("newcontrol.xml");
newControl.Content = XamlReader.Load(xaml);
newControl.DataContext = SelectedColors;
DataContext = this;
}
public List<ColorInfo> AvailableColors
{
get
{
return new List<ColorInfo>()
{
new ColorInfo() {Color = Colors.Red },
new ColorInfo() { Color = Colors.Green },
new ColorInfo() { Color = Colors.Blue },
new ColorInfo() { Color = Colors.Yellow }
};
}
}
public Dictionary<string, ColorInfo> SelectedColors { get; private set;}
}
public class ColorInfo : INotifyPropertyChanged
{
private Color _color;
public Color Color
{
get { return _color; }
set
{
_color = value;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("Color"));
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
}
要加载的 XAML 文件 (newcontrol.xml):
<?xml version="1.0" encoding="utf-8"?>
<Viewbox
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Name="Document" Stretch="Fill">
<Canvas Height="64" Width="128" ClipToBounds="True">
<Canvas.Background>
<LinearGradientBrush StartPoint="1,0">
<GradientStop Color="{Binding Path=[color0].Color}" Offset="0" />
<GradientStop Color="{Binding Path=[color1].Color}" Offset="1" />
</LinearGradientBrush>
</Canvas.Background>
</Canvas>
</Viewbox>
关于c# - 加载的 XAML 未正确绑定(bind)到现有元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3291433/
我想创建一个包含一堆其他 XAML 文件的主 XAML 文件。这可能吗? 最佳答案 在您的主 Xaml 中,使用 项目控件 balise 和 Xaml 组合器,您必须使用 定义您的项目用户控件 代替
如何在 xaml 中更改 ToggleSwitch 中实际开关的大小?我可以更改 OnContent 和 OffContent 的文本大小,但滑动开关永远不会更改大小。 这些都不会改变开关本身的大小,
我有一个文本 block 列表,其中可能包括里面的 url,比如: 构建失败,请在此处查看更多信息:http://... 构建成功 应用 http://myapp/无法启动,请在此处查看更多信息:ht
我想做的事 我最近一直在探索 XAML 资源字典。它们非常强大,但为了减少(甚至进一步)为适应任何修改而需要进行的更改,我想使用一些基本的算术运算来更改 HeightRequest Entry 的属性
我使用以下代码创建了一个弹出窗口,但我不知道如何将它居中 我试图在运行时自动更改边距,但我不知道该怎么做,但是有人知道如何将弹出窗口居中吗? 它没有标准维度,因为我需要全局化我的程序
哪种类型的命名更适合在 XAML 中使用: xmlns:inventoryControls="clr-namespace:Inventory.Components.Controls;assembly=
我正在尝试格式化我的 string每 3 位有逗号,如果不是整数,则为小数。我检查了大约 20 个示例,这是我最接近的示例: 但我得到一个 The property 'StringFormat' w
在 Windows Phone 8 中,我想将一个图像放在一个圆圈中。是否有类似网格的圆形容器?我知道有椭圆位它不是容器 最佳答案 这是我如何做到的。
有没有办法在 XAML 中检查逻辑非逻辑。我试图绑定(bind)到广泛使用的属性,但是对于这些新的绑定(bind),它的方式是错误的。我不想修改属性,那么有没有办法在 xaml 中反转 bool 结果
在 html 中可以说 width="20%"。这在 XAML 中当然是不允许的。有谁知道为什么会这样或者有没有办法在 XAML 中获得百分比值支持? 最佳答案 网格列定义和行定义允许比例单位(除了固
我可以动态创建 XAML 并将其弹出到我的应用程序中吗?该怎么做呢? 最佳答案 是的,这很简单: XmlReader tXml = XmlReader.Create(myXamlString); UI
简短版: 如果不使用 xamlc 预编译 xaml,应用程序中捆绑了什么以在运行时编译 xaml?它是否取决于 xamarin.forms nugets 之外的应用构建时的当前工具集? 长版: 我们有
我知道如何显示内容页面,但如何根据方向选择正确的布局。我想编写 xaml 文件:一个用于垂直方向,另一个用于水平方向。方向改变时是否可以切换xaml文件 最佳答案 Xamarin.Forms does
我是一名 Android 开发者,我是 Windows Phone 8 的新手 最近我做了一个 android 应用程序..所以我想在 Windows Phone 8 中开发具有相同 View 和相同
在库中编译 XAML 时出现以下错误: Themes\Generic.xaml(35,12): XamlCompiler error WMC0610: XBF generation error cod
我需要在几个不同的 XAML 布局文件中包含一个通用的 XAML。 我不想在其他 XAML 文件中对重复的 XAML 部分进行硬编码。 怎么做包含? 最佳答案 你能把共享代码变成UserControl
我想像这样添加一个符号: 这行不通,所以我尝试用\分隔,但也行不通。有人对我如何做到这一点有任何建议吗? 最佳答案 其实这个问题不是关于XAML的,它只是一个纯XML的问题。 XML中有些字符需要转
我在 Xaml 中定义了这样的列表。 #3599B8 #374649 #FD625E #F2C80F
在向 Microsoft 报告之前,我想在这里问一下。我有一个问题,我无法看到我的 WinUI 3 应用程序的实时可视化树。我什至看不到应用程序内工具栏。我可以在 WPF 和 UWP 应用程序中看到,
我已经定义了一个动画作为一个资源,当通过这样的 EventTrigger 调用时它可以工作: 然后
我是一名优秀的程序员,十分优秀!