Почему делает WindowStartupLocation =, CenterScreen помещают мое окно куда-нибудь кроме центра экрана?

В зависимости от варианта использования я обычно использовал бы что-то простой как следующее:

abstract class DaysOfWeek
{
    const Sunday = 0;
    const Monday = 1;
    // etc.
}

$today = DaysOfWeek::Sunday;

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

abstract class BasicEnum {
    private static $constCacheArray = NULL;

    private static function getConstants() {
        if (self::$constCacheArray == NULL) {
            self::$constCacheArray = [];
        }
        $calledClass = get_called_class();
        if (!array_key_exists($calledClass, self::$constCacheArray)) {
            $reflect = new ReflectionClass($calledClass);
            self::$constCacheArray[$calledClass] = $reflect->getConstants();
        }
        return self::$constCacheArray[$calledClass];
    }

    public static function isValidName($name, $strict = false) {
        $constants = self::getConstants();

        if ($strict) {
            return array_key_exists($name, $constants);
        }

        $keys = array_map('strtolower', array_keys($constants));
        return in_array(strtolower($name), $keys);
    }

    public static function isValidValue($value, $strict = true) {
        $values = array_values(self::getConstants());
        return in_array($value, $values, $strict);
    }
}

Путем создания простого класса Enum, который расширяет BasicEnum, у Вас теперь есть способность использовать методы таким образом для простого контроля ввода:

abstract class DaysOfWeek extends BasicEnum {
    const Sunday = 0;
    const Monday = 1;
    const Tuesday = 2;
    const Wednesday = 3;
    const Thursday = 4;
    const Friday = 5;
    const Saturday = 6;
}

DaysOfWeek::isValidName('Humpday');                  // false
DaysOfWeek::isValidName('Monday');                   // true
DaysOfWeek::isValidName('monday');                   // true
DaysOfWeek::isValidName('monday', $strict = true);   // false
DaysOfWeek::isValidName(0);                          // false

DaysOfWeek::isValidValue(0);                         // true
DaysOfWeek::isValidValue(5);                         // true
DaysOfWeek::isValidValue(7);                         // false
DaysOfWeek::isValidValue('Friday');                  // false

Как примечание стороны, любое время я использую отражение, по крайней мере, однажды на статическом классе / классе константы, где данные не изменятся (такой как в перечислении), я кэширую результаты тех отражательных вызовов, начиная с использования нового отражения возражает, что каждый раз в конечном счете окажет значимое влияние производительности (Сохраненный в ассоциативном массиве для нескольких перечислений).

Теперь, когда большинство людей имеет наконец обновленный до по крайней мере 5,3, и SplEnum, доступно, который является, конечно, жизнеспособным вариантом также - пока Вы не возражаете против традиционно неинтуитивного понятия наличия фактического перечисления инстанцирования всюду по Вашей кодовой базе. В вышеупомянутом примере, BasicEnum и DaysOfWeek не может быть инстанцирован вообще, и при этом они не должны быть.

12
задан devuxer 31 July 2009 в 00:38
поделиться

2 ответа

Могут ли ваши привязки Ширина и Высота мешать? Если вы вообще не устанавливаете Ширина и Высота , отображается ли окно в правильном месте? Если да, то находится ли это в том же месте, что и при установке привязок, как указано выше?

Если все это правда, то похоже, что WPF вычисляет местоположение окна до получения значения Width и Высота от ваших привязок. Я не уверен, как это обойти - возможно, сначала установите Width и Height вручную (либо в XAML, либо в конструкторе), а затем настройте привязки, как только он отображается?

4
ответ дан 2 December 2019 в 23:20
поделиться

Я не вижу ссылок на поля в ваших примерах. Однако я часто расстраиваюсь, когда Visual Studio меняет поля для элементов (когда они re в сетке) после перетаскивания стороны объекта в дизайнере (я бы подумал, что это изменит его ширину, а не поле). Кроме того, странные поля могут вызвать неожиданные проблемы с размещением.

0
ответ дан 2 December 2019 в 23:20
поделиться
Другие вопросы по тегам:

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