Использование системных типов в XAML в качестве ресурсов - PullRequest
19 голосов
/ 10 сентября 2010

Я столкнулся с ситуацией, когда было бы очень полезно указать значение с плавающей запятой непосредственно в 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» не является допустимым значением свойства »Width '".

Но свойство" Width " равно double, так почему я не могу установить его, используя StaticResource, который был определен?Кто-нибудь знает, как это сделать?

Ответы [ 2 ]

30 голосов
/ 10 сентября 2010

Нет. 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>
3 голосов
/ 10 сентября 2010

Проблема, с которой вы сталкиваетесь, заключается в том, что для объекта ColumnDefinition свойство Width имеет значение NOT double, это структура GridLength.Если вы посмотрите документацию MSDN для ColumnDefinition.Width , вы увидите, что вы не можете назначить двойное значение для ColumnDefinition.Width

...