Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> таймер 
V
    Опции темы
maxxi
Дата 16.2.2011, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 22.4.2007

Репутация: нет
Всего: нет



доброго времени суток всем участникам форума!

начинаю разбираться с WPF с C# и возникла следующая проблема - 

после нажатия на CheckBox через 2 секунды нужно сделать ТекстБокс видимым. (до того, как чек бокс не нажат - текст бокс не видим).
В течении этох двух секунд, после нажатия на чек бокс, хотелось бы "имиторовать" ожидание - то есть, чтобы курсор мышки был как при ожидании выполнении программы - или песочные часы или окружность, как в Висте. 

- Как лучше сделать?

- Просто "остновить" прорамму, например так  
Код
System.Threading.Thread.Sleep(2000);



Но как тогда указать, чтобы в течении этих двух секунд двигался курсор?

- или написать таймер?
Вот мой таймер, только он не работает...Тест бокс не отображается. Подскажите, пожайлуста, что делаю не правильно.
Код

 private void RecommendWineChecked(object sender, EventArgs e) {  // нажат нужный чек бокс
            Timer timer = new Timer { Interval = 2000, AutoReset = true };
                timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
                timer.Start();
 
             }
 
       void timer_Elapsed(object sender, ElapsedEventArgs e)
            {
             
                RecommendedWine.Visibility = Visibility.Visible;  //отобразить текст бокс
            }
 


спасибо за ответы
PM MAIL   Вверх
SKrivosein
  Дата 16.2.2011, 03:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Идущий в даль
**


Профиль
Группа: Участник
Сообщений: 271
Регистрация: 9.6.2007
Где: Praha - Прага

Репутация: 4
Всего: 8



Если действительо говорим о WPF , то одна из его (WPF) задач была отделить такие замарочки от логики приложения (кода C#) и перенести их в XAML.
Моё рашение
Код

<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" x:Name="window" mc:Ignorable="d" 
    x:Class="WpfApplication1.MainWindow"
        Title="MainWindow" Height="151" Width="342">
    <Window.Resources>
        <Storyboard x:Key="OnChecked1">
            <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)" Storyboard.TargetName="textBox1">
                <DiscreteObjectKeyFrame KeyTime="0:0:1" Value="{x:Static Visibility.Visible}"/>
            </ObjectAnimationUsingKeyFrames>
            <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="textBox1">
                <SplineDoubleKeyFrame KeyTime="0:0:1" Value="0"/>
                <SplineDoubleKeyFrame KeyTime="0:0:2" Value="1"/>
            </DoubleAnimationUsingKeyFrames>
            <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(FrameworkElement.Cursor)" Storyboard.TargetName="window">
                <DiscreteObjectKeyFrame KeyTime="0">
                    <DiscreteObjectKeyFrame.Value>
                        <Cursor>Wait</Cursor>
                    </DiscreteObjectKeyFrame.Value>
                </DiscreteObjectKeyFrame>
                <DiscreteObjectKeyFrame KeyTime="0:0:2">
                    <DiscreteObjectKeyFrame.Value>
                        <Cursor>Arrow</Cursor>
                    </DiscreteObjectKeyFrame.Value>
                </DiscreteObjectKeyFrame>
            </ObjectAnimationUsingKeyFrames>
        </Storyboard>
        <Storyboard x:Key="OnUnchecked1">
            <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)" Storyboard.TargetName="textBox1">
                <DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Visible}"/>
                <DiscreteObjectKeyFrame KeyTime="0:0:0.1" Value="{x:Static Visibility.Collapsed}"/>
            </ObjectAnimationUsingKeyFrames>
        </Storyboard>
    </Window.Resources>
    <Window.Triggers>
        <EventTrigger RoutedEvent="ToggleButton.Checked" SourceName="checkBox1">
            <BeginStoryboard Storyboard="{StaticResource OnChecked1}"/>
        </EventTrigger>
        <EventTrigger RoutedEvent="ToggleButton.Unchecked" SourceName="checkBox1">
            <BeginStoryboard x:Name="OnUnchecked1_BeginStoryboard" Storyboard="{StaticResource OnUnchecked1}"/>
        </EventTrigger>
    </Window.Triggers>
    <Grid>
        <CheckBox Content="CheckBox" Height="16" HorizontalAlignment="Left" Margin="48,45,0,0" x:Name="checkBox1" VerticalAlignment="Top" />
        <TextBox Height="20" HorizontalAlignment="Left" Margin="138,41,0,0" x:Name="textBox1" VerticalAlignment="Top" Width="104" Text="Text" Visibility="Collapsed" 
                 d:IsHidden="True" />
    </Grid>
</Window>


и не одной строки кода. Причем можно добавлять сколько угодно анимации, главне не переборщить  smile .
Сделано в Бленде за пару секунд.

А что касается твоего таймера,
Код

Timer timer = new Timer { Interval = 2000, AutoReset = true }; //???
                timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
                timer.Start();

 может я чего недоганяю, в каком пространстве имён ты его взял?


Это сообщение отредактировал(а) SKrivosein - 16.2.2011, 11:59


--------------------
Оптимист - это плохо информированный человек.
user posted image

PM MAIL   Вверх
maxxi
Дата 16.2.2011, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 22.4.2007

Репутация: нет
Всего: нет



большое спасибо за ответ!

таймер я имел в виду из System.Timers.

Но при помощи триггеров - намного проще, не знал что так можно.

А вот чисто теоретически - возможно, к примеру, скачать какой-нибудь 3Д курсор для Виндоус и его использовать в WPF?
PM MAIL   Вверх
-Mikle-
Дата 16.2.2011, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 17
Всего: 59



Я не понял, что значит 3D в вашем понимании (возможно вы имеете ввиду просто объемно-выглядящий курсор), но курсор загрузить конечно же можно. Используйте один из конструкторов класса Cursor. Можно загрузить из файла *.cur или *.ani, либо из потока.


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
jonie
Дата 16.2.2011, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



Код

метод()
{
            Timer timer = new Timer { Interval = 2000, AutoReset = true };
                timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
                timer.Start();
}

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

В документации кстати [http://msdn.microsoft.com/en-us/library/system.timers.timer.aspx] это указано(в примере смотрите, мол вызывайте GC.KeepAlive() чтобы держать GC "вкурсе" что таймер вам этот нужен).

Я на хабре разбирал подобное с таймером, где в релизе тикает раз и GC жрет таймер. Только там другой таймер, с этим так просто не получится показать.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
SKrivosein
Дата 17.2.2011, 05:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Идущий в даль
**


Профиль
Группа: Участник
Сообщений: 271
Регистрация: 9.6.2007
Где: Praha - Прага

Репутация: 4
Всего: 8



Проверил код на дебагеру
Возникает две интересные вещи, во первых
Код

private void RecommendWineChecked(object sender, EventArgs e) { 
            Timer timer = new Timer { Interval = 2000, AutoReset = true };
                timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
                timer.Start();
             }

так как AutoReset = true таймер продолжает лупить каждые две секунды.
Во вторых, даже если это исправить, главная ошибка
Код

 void timer_Elapsed(object sender, ElapsedEventArgs e)
            {
                RecommendedWine.Visibility = Visibility.Visible;  // <- здесь
            }

System.InvalidOperationException was unhandled by user code
  Message=Процесс не может получить обьект, потому что он пренадлежит другому процессу.
  Source=WindowsBase
  StackTrace:
       v System.Windows.Threading.Dispatcher.VerifyAccess()
       v System.Windows.Threading.DispatcherObject.VerifyAccess()
       v System.Windows.DependencyObject.SetValue(DependencyProperty dp, Object value)
       v System.Windows.UIElement.set_Visibility(Visibility value)
       v WpfApplication1.MainWindow.timer_Elapsed(Object sender, ElapsedEventArgs e) v C:\Users\SERGEJ\Documents\Visual Studio 2010
                \Projects\WpfApplication1\WpfApplication1\MainWindow.xaml.cs: 36
       v System.Timers.Timer.MyTimerCallback(Object state)
  InnerExcept

Сижу, думаю... smile 

Это сообщение отредактировал(а) SKrivosein - 17.2.2011, 05:21


--------------------
Оптимист - это плохо информированный человек.
user posted image

PM MAIL   Вверх
-Mikle-
Дата 17.2.2011, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 17
Всего: 59



Цитата(SKrivosein @  17.2.2011,  08:06 Найти цитируемый пост)
Сижу, думаю... 

Цитата(maxxi @  16.2.2011,  20:32 Найти цитируемый пост)
таймер я имел в виду из System.Timers

Этот таймер потоковый. Для работы с ЮИ он не подходит. Варианта много:

1) Использовать то, что предложил SKrivosein в XAML
2) Использовать таймер из пространства System.Windows.Forms
3) Оставить таймер из System.Timer, но в timer_Elapsed код, работающий с UI, поместить в this.Invoke(....)
4) Использовать просто отдельный поток в миксе с (3)
5) Использовать микс между XAML и кодом управляя из кода через VisualStateManager

(1) Уже есть
(2) Проблем с пониманием не должно быть

(3)
Код

void timer_Elapsed(object sender, ElapsedEventArgs e)
{
    this.Invoke((Action)delegate
    {
        RecommendedWine.Visibility = Visibility.Visible;
    });
}


(4)
Код

private void RecommendWineChecked(object sender, EventArgs e)
{
    ThreadPool.QueueUserWorkItem(SetWine, 2000);
}

private void SetWine(object state)
{
    Thread.Sleep((int)state);
    this.Invoke((Action)delegate
    {
        RecommendedWine.Visibility = Visibility.Visible;
    });
}


(5)
Сначала в МСДН за описанием про VisualStateManager.
Начать отсюда можно: http://msdn.microsoft.com/ru-ru/library/sy...atemanager.aspx


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
jonie
Дата 17.2.2011, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 22
Всего: 118



Цитата(SKrivosein @  17.2.2011,  05:06 Найти цитируемый пост)

так как AutoReset = true таймер продолжает лупить каждые две секунды.

http://habrahabr.ru/blogs/net/108815/ почитайте.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
maxxi
Дата 17.2.2011, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 22.4.2007

Репутация: нет
Всего: нет



н. п. 
всем спасибо!
разобрался!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0502 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.