Как я могу определить и использовать переменную в XAML для определения цвета?

РЕДАКТИРОВАТЬ: Я согласен с другими, которые говорят, что с C # 6.0 фильтры исключений теперь являются идеальным способом: catch (Exception ex) when (ex is ... || ex is ... )

За исключением того, что я до сих пор вид ненависти макета с одной длинной строкой и лично выложил бы код следующим образом. Я думаю, что это так же функционально, как и эстетично, так как я считаю, что это улучшает понимание. Некоторые могут не согласиться:

catch (Exception ex) when (
    ex is ...
    || ex is ...
    || ex is ...
)

ОРИГИНАЛ:

Я знаю, что я немного опоздал на вечеринку здесь, но святой дым ...

Если перейти прямо к погоне, этот вид дублирует более ранний ответ, но если вы действительно хотите выполнить общее действие для нескольких типов исключений и сохранить все в чистоте и порядке в рамках одного метода, почему бы не просто использовать лямбда / закрытие / встроенную функцию, чтобы сделать что-то вроде следующего? Я имею в виду, что вполне вероятно, что в итоге вы поймете, что просто хотите сделать это закрытие отдельным методом, который вы можете использовать повсюду. Но тогда это будет очень легко сделать без реального структурного изменения остальной части кода. Правильно?

private void TestMethod ()
{
    Action<Exception> errorHandler = ( ex ) => {
        // write to a log, whatever...
    };

    try
    {
        // try some stuff
    }
    catch ( FormatException  ex ) { errorHandler ( ex ); }
    catch ( OverflowException ex ) { errorHandler ( ex ); }
    catch ( ArgumentNullException ex ) { errorHandler ( ex ); }
}

Я не могу не задаться вопросом ( предупреждение: впереди немного иронии / сарказма), зачем, черт возьми, приложить все эти усилия, чтобы просто заменить следующее:

try
{
    // try some stuff
}
catch( FormatException ex ){}
catch( OverflowException ex ){}
catch( ArgumentNullException ex ){}

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

// sorta sucks, let's be honest...
try
{
    // try some stuff
}
catch( Exception ex )
{
    if (ex is FormatException ||
        ex is OverflowException ||
        ex is ArgumentNullException)
    {
        // write to a log, whatever...
        return;
    }
    throw;
}

Потому что это, конечно, автоматически не более читабельно.

Конечно, я оставил три идентичных экземпляра /* write to a log, whatever... */ return; из первого примера.

1123 Но это моя точка зрения. Вы все слышали о функциях / методах, верно? Шутки в сторону. Напишите общую функцию ErrorHandler и, как ее, вызывайте из каждого блока catch.

Если вы спросите меня, второй пример (с ключевыми словами if и is) значительно менее читабелен и одновременно значительно более подвержен ошибкам на этапе обслуживания вашего проекта.

Фаза обслуживания для тех, кто может быть относительно новичком в программировании, будет составлять 98,7% или более от общего срока службы вашего проекта, и плохое чмо, выполняющее обслуживание, почти наверняка будет кем-то другим, кроме вас. , И есть очень хороший шанс, что они будут тратить 50% своего времени на работу, ругая ваше имя.

И, конечно, FxCop лает на вас, и поэтому вы должны также добавить атрибут в ваш код, который имеет точный zip, связанный с работающей программой, и доступен только для попросите FxCop игнорировать проблему, которая в 99,9% случаев является абсолютно правильной при маркировке. И, извините, я могу ошибаться, но разве этот атрибут «игнорировать» не скомпилирован в ваше приложение?

Не сделает ли тест if в одной строке его более читабельным? Я так не думаю. Я имею в виду, у меня когда-то был другой программист, яростно споривший однажды, что размещение большего количества кода в одной строке заставит его «работать быстрее». Но, конечно, он был совершенно безумным. Попытка объяснить ему (с открытым лицом - что было непросто), как интерпретатор или компилятор разбил бы эту длинную строку на дискретные операторы по одной инструкции на строку - по существу, идентичные результату, если бы он пошел вперед и просто сделал код читабельным вместо того, чтобы пытаться перехитрить компилятор - не оказал на него никакого влияния. Но я отвлекся.

Насколько менее читаемым это становится, когда вы добавляете еще три типа исключений, через месяц или два? (Ответ: становится лот менее читабельным).

Один из главных моментов, на самом деле, заключается в том, что основная часть форматирования текстового исходного кода, на который мы все смотрим каждый день, состоит в том, чтобы сделать его действительно, действительно очевидным для других людей, что на самом деле происходит, когда код работает. Потому что компилятор превращает исходный код во что-то совершенно другое и не заботится о вашем стиле форматирования кода. Так что все в одной линии - полный отстой.

Просто говорю ...

// super sucks...
catch( Exception ex )
{
    if ( ex is FormatException || ex is OverflowException || ex is ArgumentNullException )
    {
        // write to a log, whatever...
        return;
    }
    throw;
}
36
задан Edward Tanguay 24 June 2009 в 10:08
поделиться

2 ответа

Попробуйте определить свой цвет как SolidColorBrush :

<SolidColorBrush x:Key="ReadOnlyTextBrush" Color="#555555" />

...

<TextBox Foreground="{StaticResource ReadOnlyTextColor}" />
46
ответ дан 27 November 2019 в 05:28
поделиться

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

 <Color x:Key="ButtonColor1">Blue</Color>
 <Color x:Key="ButtonColor1">#AABBCC</Color>
 <Color x:Key="ButtonColor1" A="0" R="124" G="111" B="44"/>
45
ответ дан 27 November 2019 в 05:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: