Настройка языка Visual Studio нарушает стандартный формат Double in Binding - PullRequest
0 голосов
/ 07 апреля 2019

Я создал несколько элементов управления «вкладками» со скошенными краями, например:

Пример вкладки

Наклонные края в основном представляют собой треугольники (Polygon).

Чтобы все было регулируемым, я определяю высоту вкладки и угол края в ResourceDictionary следующим образом:

<!-- Height of the Ribbon Tabs in pixels -->
<system:Int32 x:Key="RibbonTabHeight">36</system:Int32>

<!-- Angle of the Ribbon Tabs edges in degrees -->
<system:Double x:Key="RibbonTabEdgeAngle">60.0</system:Double>

Ширина края (то есть ширина треугольника) будет рассчитываться исходя из этого с помощью тригонометрии. Для этого я реализовал конвертер, так что я смогу использовать его позже в XAML:

/// <summary>
/// Converts the height of a tab to the width of the sloped edge while retaining the desired angle of the edge
/// </summary>
/// <remarks>
/// The tab height shall be passed as the value to be converted
/// The edge angle shall be passed as the converter parameter
/// </remarks>
public class TabHeightToEdgeWidthConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        // Interpret the passed value as the tab height
        double tabHeight = System.Convert.ToDouble(value);

        // Interpret the passed parameter as the desired angle of the edge
        double edgeAngle = System.Convert.ToDouble(parameter);

        // Convert degrees in radians
        edgeAngle = (Math.PI / 180) * edgeAngle;

        // The tangent of the edge angle equals the opposite side (tab height) divided by the adjacent side (edge width)
        // Therefore, the edge width equals the tab height divided by the tangent of the edge angle
        double edgeWidth = tabHeight / Math.Tan(edgeAngle);

        return edgeWidth;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Для структуры вкладки я использую Grid с тремя столбцами - первый столбец содержит левый край (треугольник), второй столбец содержит фактическое содержимое вкладки (например, значок) и третий столбец содержит правый край (треугольник).

Сложив все вместе, у меня есть это:

<Grid x:Name="RibbonTabGrid"
      Height="{Binding Source={StaticResource RibbonTabHeight}}">

    <Grid.ColumnDefinitions>

        <!-- Column 0: Left edge -->
        <ColumnDefinition x:Name="RibbonTabLeftEdgeGridCell"
                          Width="{Binding Source={StaticResource RibbonTabHeight},
                          Converter={StaticResource TabHeightToEdgeWidthConverter},
                          ConverterParameter={StaticResource RibbonTabEdgeAngle}}"/>

        <!-- ... -->

    </Grid.ColumnDefinitions>

</Grid>

Однако, как только я добавил ConverterParameter в привязку, как показано выше, Visual Studio сообщает мне:

«Неправильная строка ввода» ,

пока все строит и работает нормально.

И вот забавная часть: если я изменю свое определение угла ребра в ResourceDictionary с Double на Int32 и избавлюсь от дробной части ("60" вместо "60.0"), то я не получит ошибку «неверный формат».

Я действительно не знаю, что я делаю здесь не так ...

Если в качестве параметра преобразователя использовать двойное жесткое кодирование, как это ...

<!-- Column 0: Left edge -->
<ColumnDefinition x:Name="RibbonTabLeftEdgeGridCell"
                  Width="{Binding Source={StaticResource RibbonTabHeight},
                  Converter={StaticResource TabHeightToEdgeWidthConverter},
                  ConverterParameter='60.0'}"/>

... Я тоже не получу никакой ошибки. Очевидно, что во время процесса преобразования что-то идет не так.

У кого-нибудь есть идеи, что может быть не так? Я мог бы легко использовать подход Int32 и просто забыть об этом, но мне не терпится узнать, как это делается правильно ...

Дайте мне знать, если мое описание проблемы непонятно или требуется дополнительная информация. Извините за весь этот дополнительный фон, я подумал, что будет лучше охватить всю цепочку привязки определения-преобразования.

Большое спасибо заранее!

РЕДАКТИРОВАТЬ: Эта проблема, кажется, вызвана языковой настройкой Visual Studio. Я использую Visual Studio с настройкой языка «Немецкий». В немецком языке десятичные запятые используются вместо десятичных, но все же в программировании десятичные точки используются в качестве общего синтаксиса. Visual Studio, кажется, все смешивает, когда дело доходит до внутренних типов, таких как привязки. Когда я перешел на «английский», проблема больше не возникала. Я собираюсь сообщить об этом в Microsoft. Спасибо @PavelAnikhouski за подсказку!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...