views:

112

answers:

2

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?

+6  A: 

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>
Yacoder
And as long as the string is in there it will be fine?
tyndall
Yes. `Resources` dictionaries can hold objects of any type, and you can reference it using `{StaticResource}` via its `x:Key` later.
Pavel Minaev
Take a look at the example, I updated my answer...
Yacoder
Awesome! I tested pulling this value from C# code and it worked great too. thanks +1 and answer
tyndall
+1  A: 

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.

PeterAllenWebb