Фокус ввода
От: Аноним  
Дата: 19.04.11 13:04
Оценка:
Создаю свой элемент:

public class MyElement : FrameworkElement
{
   // .........
}


Как можно реализовать возможность фокуса ввода? this.Focus() возвращает всегда false. И даже когда свойству this.Focusable присваиваю true, то все равно this.Focus() равен false.
Значения свойств после this.Focusable = true;
this.Focusable == true
this.IsEnabled == true
this.IsFocused == true
this.IsKeyboardFocused == false
this.Focus() == false

Статический метода Keyboard.Focus(this) возвращает null
Re: Фокус ввода
От: v.makeev Россия  
Дата: 19.04.11 17:30
Оценка:
Здравствуйте, Аноним

А вы добавили свой элемент в визуальное дерево? (something.AddVisualChild(myElement))
Если нет, то следующий код абсолютно законно вернет a == false и b == null.

var myElement = new MyElement {Focusable = true, IsEnabled = true};
var a = myElement.Focus();
var b = Keyboard.Focus(myElement);
Re[2]: Фокус ввода
От: Аноним  
Дата: 20.04.11 06:38
Оценка:
Здравствуйте, v.makeev, Вы писали:

VM>Здравствуйте, Аноним


VM>А вы добавили свой элемент в визуальное дерево? (something.AddVisualChild(myElement))

VM>Если нет, то следующий код абсолютно законно вернет a == false и b == null.

VM>
VM>var myElement = new MyElement {Focusable = true, IsEnabled = true};
VM>var a = myElement.Focus();
VM>var b = Keyboard.Focus(myElement);
VM>



Да-да, я добавлял в визуальное дерево. Проблема была в том, что я myElement.Focus() вызывал в конструкторе, а не в событие Loaded
Теперь все работает. Спасибо!
Re[3]: Фокус ввода
От: Аноним  
Дата: 20.04.11 12:14
Оценка:
Теперь другая проблема получилась. На панели отобразил свой элемент и кнопку. По умолчанию фокус стоит на моем элементе. При нажатии на TAB фокус переходит на кнопку. При дальнейшим нажатии на TAB по идее фокус должен возвратиться на мой элемент, но приложение зависает... В чем может быть проблема? Есть же еще у стандартных элементов свойство TabIndex, которые унаследованы от Control, а у меня его нет. может в этом проблема?
Re[4]: Фокус ввода
От: Аноним  
Дата: 20.04.11 12:31
Оценка:
public class MyElement : FrameworkElement
{
    public static readonly DependencyProperty IsTabStopProperty;
    public static readonly DependencyProperty TabIndexProperty;


    static Cell()
    {
        IsTabStopProperty = KeyboardNavigation.IsTabStopProperty.AddOwner(typeof(Cell));
        TabIndexProperty = KeyboardNavigation.TabIndexProperty.AddOwner(typeof(Cell));

    }

    public bool IsTabStop
    {
        get
        {
            return (bool)base.GetValue(IsTabStopProperty);
        }
        set
        {
            base.SetValue(IsTabStopProperty, value);
        }
    }

    public int TabIndex
    {
        get
        {
            return (int)base.GetValue(TabIndexProperty);
        }
        set
        {
            base.SetValue(TabIndexProperty, value);
        }
    }
   
    // .............
}

Проблему не решило. Все равно виснет
Re[4]: Фокус ввода
От: DmitryMS  
Дата: 20.04.11 12:32
Оценка:
Вы смотрели на FocusManager?
Re[4]: Фокус ввода
От: DmitryMS  
Дата: 20.04.11 12:36
Оценка: +1
Кстати, зачем наследоваться на таком высоком уровне как FrameworkElement, чем плох Control, если уж так хочется наследоваться?
Re[5]: Фокус ввода
От: _FRED_ Черногория
Дата: 20.04.11 12:45
Оценка:
Здравствуйте, DmitryMS, Вы писали:

DMS>Кстати, зачем наследоваться на таком высоком уровне как FrameworkElement, чем плох Control, если уж так хочется наследоваться?


Скорее, "на таком _низком_ уровне". А чем "базовее" базу выберешь, чем меньше классов в иерархии между тобой и выше будет, тем тем меньше будешь от этой самой базы зависеть.
Help will always be given at Hogwarts to those who ask for it.
Re[5]: Фокус ввода
От: Аноним  
Дата: 20.04.11 12:50
Оценка:
Здравствуйте, DmitryMS, Вы писали:

DMS>Вы смотрели на FocusManager?


Это типо такого?

 Panel panel = this.Parent as Panel;
 FocusManager.SetFocusedElement(panel, this);

Чего-то не помогло.
Re[5]: Фокус ввода
От: Аноним  
Дата: 20.04.11 12:58
Оценка:
Здравствуйте, DmitryMS, Вы писали:

DMS>Кстати, зачем наследоваться на таком высоком уровне как FrameworkElement, чем плох Control, если уж так хочется наследоваться?


Не нужны:

Template
TemplateCache
VerticalContentAlignment
BorderThickness
и т.д.
Re[6]: Фокус ввода
От: DmitryMS  
Дата: 20.04.11 13:26
Оценка:
Здравствуйте, _FRED_, Вы писали:

DMS>>Кстати, зачем наследоваться на таком высоком уровне как FrameworkElement, чем плох Control, если уж так хочется наследоваться?


>>FR>Скорее, "на таком _низком_ уровне".


DMS>>Что за бред Имелось ввиду уровне [абстракции]. "Знание предмета на низком уровне" оставляем в пэтэушном прошлом


>>FR>А чем "базовее" базу выберешь, чем меньше классов в иерархии между тобой и выше будет, тем тем меньше будешь от этой самой базы зависеть.


DMS>> типичная поза программиста — фиг с ним, пусть не работает, но зато мощно и расширяемO


Проблема в том что наледуюсь от высокоабстрактного обьекта вы взваливаете на себя кучу ответственности , плюс — нетипичный = непротестированный сценарий использования. Вы просто можете не знать о необходимости перегрузки виртуального вызова, необходимого для корректной работы вашей имплементации

Наследоваться от FramworkElement's для своего визуального компонента (я не рассматриваю людей, предпочитающих наследоваться от object, на всякий случай — вдруг мощь где то утеряется?) смысла нет.
Re[6]: Фокус ввода
От: Аноним  
Дата: 20.04.11 13:31
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, DmitryMS, Вы писали:


DMS>>Вы смотрели на FocusManager?


А>Это типо такого?


А>
А> Panel panel = this.Parent as Panel;
А> FocusManager.SetFocusedElement(panel, this);
А>

А>Чего-то не помогло.

Проблема решилась следующей строчкой

 FocusManager.SetIsFocusScope(this, true);

А вот как реализовать TabIndex? выше изложенный вариант, который я скопировал из рефлектора, при просмотре класса Control, игнорирует значения свойства TabIndex
Re[7]: Фокус ввода
От: DmitryMS  
Дата: 20.04.11 13:34
Оценка:
IsTabStop == true?
Re[6]: Фокус ввода
От: DmitryMS  
Дата: 20.04.11 13:36
Оценка:
FrameworkElement — суть коннектор, даже мсдн советует наследоваться от Panel/Control.

If you intend to use FrameworkElement as a base class, you might want to first examine the existing derived classes. FrameworkElement provides support for a number of basic scenarios, but also lacks a number of features that are desirable for an "element" in the sense of a building block that you use to create user interface (UI) in Extensible Application Markup Language (XAML). For instance, a FrameworkElement does not define any true content model; FrameworkElement as a base class does not define a property that can create XAML child elements. In particular, you might want to look at Control and ContentControl.
Re[8]: Фокус ввода
От: Аноним  
Дата: 20.04.11 13:41
Оценка:
Здравствуйте, DmitryMS, Вы писали:

DMS>IsTabStop == true?

Да
Re[9]: Фокус ввода
От: DmitryMS  
Дата: 20.04.11 13:53
Оценка:
kod kin'te
Re[6]: Фокус ввода
От: Sinix  
Дата: 20.04.11 14:07
Оценка: +1
Здравствуйте, _FRED_, Вы писали:

_FR>Скорее, "на таком _низком_ уровне". А чем "базовее" базу выберешь, чем меньше классов в иерархии между тобой и выше будет, тем тем меньше будешь от этой самой базы зависеть.


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

Официальный гадлайн — интерактивные контролы должны наследоваться от Control.

Deriving from the Control class is the model used by most of the existing WPF controls
...
Consider deriving from FrameworkElement if any of the following apply:

— You want to have precise control over the appearance of your control beyond what is provided by simple element composition.
— You want to define the appearance of your control by defining your own render logic.
— You want to compose existing elements in novel ways that go beyond what is possible with UserControl and Control.


Вон ТС уже фокус переизобретает... ну-ну.
Re[4]: Фокус ввода
От: v.makeev Россия  
Дата: 20.04.11 14:18
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Теперь другая проблема получилась. На панели отобразил свой элемент и кнопку. По умолчанию фокус стоит на моем элементе. При нажатии на TAB фокус переходит на кнопку. При дальнейшим нажатии на TAB по идее фокус должен возвратиться на мой элемент, но приложение зависает... В чем может быть проблема? Есть же еще у стандартных элементов свойство TabIndex, которые унаследованы от Control, а у меня его нет. может в этом проблема?


Не в TabIndex'е счастье

// Да-да, абсолютно пустой класс
public class MyElement : FrameworkElement
{
}

...
private void SomeMethodOfWindow()
{
    var myElement = new MyElement { Focusable = true, IsEnabled = true, Width = 50, Height = 50 };
    grid.Children.Add(myElement);
}


Обрабатывает клавишу TAB абсолютно корректно. Возможно, какие-то составные части вашего элемента тоже пытаются обработать TAB.
WpfInspector вам в помощь
Re[7]: Фокус ввода
От: _FRED_ Черногория
Дата: 20.04.11 14:27
Оценка:
Здравствуйте, DmitryMS, Вы писали:

DMS>>>Кстати, зачем наследоваться на таком высоком уровне как FrameworkElement, чем плох Control, если уж так хочется наследоваться?

>>>FR>Скорее, "на таком _низком_ уровне".
DMS>>>Что за бред Имелось ввиду уровне [абстракции]. "Знание предмета на низком уровне" оставляем в пэтэушном прошлом
>>>FR>А чем "базовее" базу выберешь, чем меньше классов в иерархии между тобой и выше будет, тем тем меньше будешь от этой самой базы зависеть.

DMS>>> типичная поза программиста — фиг с ним, пусть не работает, но зато мощно и расширяемO


Что именно у меня не работает? "типичная поза программиста" — это не брать лишнего и обходиться минимально необходимым.

DMS>Проблема в том что наледуюсь от высокоабстрактного обьекта вы взваливаете на себя кучу ответственности ,


Да что вы? И какую же именно ответственность я на себя взваливаю в этом конкретном случае? Что вы понимаете под "высокоабстрактного обьекта" и как это связано с "ответственностью"?

DMS>плюс — нетипичный = непротестированный сценарий использования.


Среди кого "нетипичный"?

DMS>Вы просто можете не знать о необходимости перегрузки виртуального вызова, необходимого для корректной работы вашей имплементации


Заодно, напомните мне пожалуйста, какой-такой метод во FrameworkElement _обязательно_ должен быть переопределён?

Я как-то привык читать документацию к классам, от которых наследуюсь. И мне требуются серьёздные основания что бы предпочесть наследование от более специализированного класса. Например в том, что касается иерархии FrameworkElement-a: наследники не просто дополняют базовую реализацию, а, в нагрузку, привносят и свою специфику. Каждый из наследников — свою собственную специфику. Если вы наследуетесь от того же Control-а и при этом не обращаете внимание на Template и не обрабатываете его — то вы не верно выбрали базовый класс — получили ненужный оверхед, ибо любой пользователь некоего Control-а вправе рассчитывать на то, что с помощью шаблона сможет на что-то повлиять.

Нет, программист, наследующийся от этого компонента должен просто обладать достаточной квалификацией, что бы понимать, что происходит [как минимум] на этом уровне абстракции (а лучше — что происходит, как минимум, на уровне дальше). И если ни понимания, ни желания понять нету — действительно, лучше от класса не наследоваться :о) Но откуда у вас сведения о квалификации топикстартера, что бы так настоятельно советовать ему как быть? Он такого совета во-первых не просил, а во-вторых вполне здраво ответил
Автор:
Дата: 20.04.11
.

DMS>Наследоваться от FramworkElement's для своего визуального компонента (я не рассматриваю людей, предпочитающих наследоваться от object, на всякий случай — вдруг мощь где то утеряется?) смысла нет.


Дело хозяйское — от чего наследуетесь вы мне не важно. Но объяснения того, почему, при прочих равных, я должен предпочесть более derived класс я не увидел — как, не знгая, что именно я хочу реализовать в своём компоненте вы берёте на себя смелость указывать мне, от кого наследоваться И что же из этого вы предложите, повторю: не зная того, что за компонент я пишу?

If you intend to use FrameworkElement as a base class, you might want to first examine the existing derived classes. FrameworkElement provides support for a number of basic scenarios, but also lacks a number of features that are desirable for an "element" in the sense of a building block that you use to create user interface (UI) in Extensible Application Markup Language (XAML). For instance, a FrameworkElement does not define any true content model; FrameworkElement as a base class does not define a property that can create XAML child elements. In particular, you might want to look at Control and ContentControl.


Уверяю вас, я внимательно читаю документацию. И не вижу тут указаний наследоваться от чего-то конкретного и не наследоваться от FrameworkElement. Даже мой плохой английский позволяет понять, что тут нет никаких указаний, а лишь совет о том, _что чаще всего_ нужно в _типовых кейсах_.
Help will always be given at Hogwarts to those who ask for it.
Re[7]: Фокус ввода
От: _FRED_ Черногория
Дата: 20.04.11 14:34
Оценка: +2
Здравствуйте, Sinix, Вы писали:

_FR>>Скорее, "на таком _низком_ уровне". А чем "базовее" базу выберешь, чем меньше классов в иерархии между тобой и выше будет, тем тем меньше будешь от этой самой базы зависеть.

S>... и тем велосипедов можно будет переизобрести. И тем больше интересных граблей нащупать
S>Официальный гадлайн — интерактивные контролы должны наследоваться от Control.
S>

S>Deriving from the Control class is the model used by most of the existing WPF controls
S>...
S>Consider deriving from FrameworkElement if any of the following apply:

S>- You want to have precise control over the appearance of your control beyond what is provided by simple element composition.
S>- You want to define the appearance of your control by defining your own render logic.
S>- You want to compose existing elements in novel ways that go beyond what is possible with UserControl and Control.

S>Вон ТС уже фокус переизобретает... ну-ну.

Написав такие слова авторитетный, к коим вас причисляю, эрэсдээновец должен быть уверен, что иных кейсов, кроме как перечисленных им, у оппоненты быть не может А их у меня есть

Задумайтесь сами — перекрывает ли вышеотквоченное всё то многообразие, что может понадобится в жизни? Неужели скудный набор имеющихся наследников FrameworkElement может удовлетворить самые взыскательные, кои предъявляю я, требования? Ну-ну
Help will always be given at Hogwarts to those who ask for it.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.