Использование типов систем в XAML в качестве ресурсов
Я столкнулся с ситуацией, когда было бы очень полезно указать значение с плавающей запятой непосредственно в XAML и использовать его в качестве ресурса для нескольких моих элементов пользовательского интерфейса. После поиска я нашел много информации о том, как включить правильную сборку (mscorlib) в ваш XAML, чтобы вы могли сделать именно это.
К сожалению, я получаю исключение в одном экземпляре, где я пытаюсь это сделать. Вот следующий XAML, который воссоздает ситуацию:
<Window x:Class="davidtestapp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:core="clr-namespace:System;assembly=mscorlib"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<core:Double x:Key="MyDouble">120</core:Double>
</Window.Resources>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="{StaticResource MyDouble}" />
<ColumnDefinition Width="40" />
<ColumnDefinition Width="40" />
</Grid.ColumnDefinitions>
<Rectangle Grid.Column="0" Fill="Red" />
<Rectangle Grid.Column="1" Fill="Green" />
<Rectangle Grid.Column="2" Fill="Blue" />
</Grid>
</Window>
Когда я пытаюсь скомпилировать и запустить это, я получаю исключение XamlParseException, которое говорит, что "120" не является допустимым значением для свойства "Ширина".
Но свойство "Ширина" является двойным, поэтому почему я не могу установить его с помощью установленного StaticResource? Кто-нибудь знает, как это сделать?
Ответы
Ответ 1
Нет. ColumnDefinition.Width имеет тип GridLength, поэтому вы получаете ошибку. Если вы делаете что-то вроде кода ниже, он должен работать нормально.
<Window.Resources>
<core:Double x:Key="MyDouble">300</core:Double>
<GridLength x:Key="MyGridLength">20</GridLength>
</Window.Resources>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="{StaticResource MyGridLength}" />
<ColumnDefinition Width="40" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Rectangle Grid.Column="0" Fill="Red" />
<Rectangle Grid.Column="1" Fill="Green" />
<Rectangle Grid.Column="2" Fill="Blue" Width="{StaticResource MyDouble}"/>
</Grid>
Ответ 2
Проблема, с которой вы сталкиваетесь, заключается в том, что в объекте ColumnDefinition свойство Width является NOT двойным, это структура GridLength. Если вы посмотрите на документацию MSDN для ColumnDefinition.Width, вы увидите, что вы не можете назначить double для ColumnDefinition.Width