Подтвердить что ты не робот

Использование типов систем в 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? Кто-нибудь знает, как это сделать?

4b9b3361

Ответ 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