Embed a System.String in XAML
Is there a way to embed a string in XAML, give it and ID and refer to it later.
I have tried:
<Window x:Class="WpfApp1.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:System="clr-namespace:System;assembly=mscorlib"
Title="Window1" Height="300" Width="500">
<Grid>
<System:String>Test</System:String>
</Grid>
</Window>
And get error:
Cannot add instance of type 'String' to a collection of type 'UIElementCollection'. Only items of type 'UIElement' are allowed.Could I do this if I nested the String somewhere else in the XAML? or inside a non UI element? Then do I just give it a Name attribute开发者_如何学C?
You should use Window.Resources
Here's an example for Page, in your case it will be Window.Resources
tag:
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:System="clr-namespace:System;assembly=mscorlib">
<Page.Resources>
<System:String x:Key="MyString">Hello</System:String>
</Page.Resources>
<Grid>
<TextBlock Text="{StaticResource MyString}"></TextBlock>
</Grid>
</Page>
In the Application tag you need to include the following:
xmlns:system="clr-namespace:System;assembly=mscorlib">
without the above code, Visual Studio will complain about a missing assembly reference.
I don't know why, but in my .Net Core 3 WPF app I should use this xmlns definition instead of "mscorlib":
xmlns:system="clr-namespace:System;assembly=System.Runtime"
then I can define:
<system:Double x:Key="FontSizeLarge">24</system:Double>
or
<system:String x:Key="StringTest">Test</system:String>
Having a reference to the string will not allow you to change it later, since strings are immutable, so as Yacoder suggests, just put it in the <Window.Resources>
section. Something like:
<Window.Resources>
<System:String x:Key="TestString">Test</System:String>
</Window.Resources>
If you need to be able to change the value of the string that appears in your grid, you'll want to use a TextBlock or other control whose Content property can be set.
And if you're like me and have typed an unwanted extra character somewhere in the XAML file, you can get this error. Fortunately I had GIT watching over my shoulder, so "Compare with Unmodified" quickly revealed that character that I had mistakenly typed at a place. Hope this can save some hair for you. :)
精彩评论