Reputation: 71131
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?
Upvotes: 25
Views: 46440
Reputation: 1330
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>
Upvotes: 5
Reputation: 35430
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. :)
Upvotes: 2
Reputation: 91
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.
Upvotes: 9
Reputation: 10408
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.
Upvotes: 2
Reputation: 17000
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>
Upvotes: 44