Поиск по этому блогу

Показаны сообщения с ярлыком WPF. Показать все сообщения
Показаны сообщения с ярлыком WPF. Показать все сообщения

среда, 21 ноября 2012 г.

WPF Бегущая строка

Новая задача - сделать бегущую строку в WPF приложении. Делается очень просто через XAML.
Значения From и To задаются исходя из размера окна программы + длина текста(в 2 раза больше окна).


Canvas x:Name="Canvas" Background="Transparent" Height="25"
                VerticalAlignment="Top">
            <TextBlock Margin="0,7,0,0" VerticalAlignment="Bottom" FontSize="15"  FontWeight="Bold" Foreground="#555"
                       Text="Тестовый текст" Canvas.Right="0">
                <TextBlock.Triggers>
                    <EventTrigger RoutedEvent="TextBlock.Loaded">
                        <EventTrigger.Actions>
                            <BeginStoryboard>
                                <Storyboard>
                                    <DoubleAnimation Storyboard.TargetProperty="(Canvas.Left)" From="1300" To="-750" 
                                                     Duration="0:0:15" RepeatBehavior="Forever"/>
                                </Storyboard>
                            </BeginStoryboard>
                        </EventTrigger.Actions>
                    </EventTrigger>
                </TextBlock.Triggers>
            </TextBlock>
        </Canvas>

среда, 3 октября 2012 г.

WPF file explorer часть 2

В продолжение создания файлового менеджера на WPF. Сегодня решил немного улучшить программу  и добавил несколько функций:

  • открытие выделенного файла в списке
  • копирование выделенного файла в списке (копирование из одной папки в другую)
  • удаление выделенного файла в списке (удаление файла из папки)
  • выделение всех файлов в списке


Открытие


private void Open_selectItem(object sender, RoutedEventArgs e)
        {
            FileInfo filinf = listBox1.SelectedItem as FileInfo;
            try 
            {
                System.Diagnostics.Process p = new System.Diagnostics.Process();
                p.StartInfo.FileName = filinf.FullName;
                p.Start();
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }

воскресенье, 23 сентября 2012 г.

WPF file explorer


Был долго занят с работой, поэтому ничего нового не публиковал. Вот появилось время, решил написать про файловый менеджер.
Задачи:
просмотр дисков и папок компьютера
показывание файлов, находящихся на диске или в папке.
В общем идея такая, чтобы рядом с именем диска была стрелочка, которая разворачивает вниз список папок, а рядом, во втором окне, показывались файлы.
Делал на WPF. Добавляем 1 treeview и 1 listview(пробовал с listBox, но там глюк с отображением содержимого папок), затем пишем такой код.



public MainWindow()
        {
            InitializeComponent();
            TreeViewDrivers();
        }
void TreeViewDrivers() 
        {
            foreach (DriveInfo drive in DriveInfo.GetDrives())
            {
                TreeViewItem item = new TreeViewItem();
                item.Tag = drive;
                item.Header = drive.ToString();
                item.Items.Add("*");
                //trw_Products.Items.Add(item);
                treeView1.Items.Add(item);

                item.Expanded += new RoutedEventHandler(item_DirExpanded);
            }
        }

вторник, 17 июля 2012 г.

Изменяем TabControl через XAML

Занялся изменением внешнего стиля TabControl. Хотелось сделать угловатые закладки как в Expression Blend 4(в самой программе) или как в Google Chrome. Есть некоторые НЕДОРАБОТКИ, но всё вполне функционирует.  Единственное неудобство - GRID в TabItem автоматичесски подстраивается под содержимое. Для начала поискал пару примеров, в общем вот что получилось.
Всё запихиваем в <Windows.Resurces>


<Style TargetType="{x:Type TabItem}">
            <Setter Property="SnapsToDevicePixels" Value="true"/>
            <Setter Property="OverridesDefaultStyle" Value="true"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type TabItem}">
                        <Grid Margin="0,0,-12,0">
                            <!--Самостоятельная проба создать вкладки-->
                            <Border Name="Border" Background="Transparent" BorderBrush="Transparent"
                                    BorderThickness="1,1,1,1" CornerRadius="6,6,0,0" />
                            <Path Name="Blablabla" Data="M0.5,3.5 C0.5,1.8431458 1.8431458,0.5 3.5,0.5 L46.5,0.5 C48.156854,0.5 75.082788,25.5 70.333333,25.5 65.583878,25.5 0.75000088,25.249498 0.5,25.583056 0.24999912,25.916615 0.5,10.944442 0.5,3.5 z" 
              Fill="Black" HorizontalAlignment="Left" Height="26.089" Stretch="Fill" Stroke="White" 
              VerticalAlignment="Bottom"  Width="110"/>
                            <ContentPresenter x:Name="ContentSite" TextElement.Foreground="White" ContentSource="Header" VerticalAlignment="Center"
                                              HorizontalAlignment="Center" Margin="0,0,18,0"/>
                        </Grid>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsSelected" Value="true">
                                <Setter TargetName="Border" Property="Background" Value="Orange" />
                                <Setter Property="Panel.ZIndex" Value="100" />
                            </Trigger>
                            <Trigger Property="IsSelected" Value="false">
                                <Setter TargetName="ContentSite" Property="TextElement.Foreground" Value="White"/>
                                <Setter TargetName="Border" Property="Background" Value="Transparent"/>

                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

понедельник, 2 июля 2012 г.

Как вытащить путь до файла через ярлык

Изначально я просто решил опробовать Drag and drop в WPF и Win Form. Сделал окошко, где был ListBox, сделал так, чтобы в него можно было перетащить файлы. В ListBox'e показывался путь до этого файла, то есть то место, откуда я  перетащил файл. Потом появилась идея каким - то образом заставить программу выдавать путь до файла, в моём случае через ярлык, узнать, где установлена программа. В общем, нашёлся такой путь решения.
GetFullPath используется как метод-функция.

 // Таким образом узнаем путь до файла, через ярлык
        string GetFullPath(FileInfo file)
        {
            // проверяем, является ли файл ярлыком
            if (file.Extension == ".lnk")
            {
                using (var fstream = File.Open(file.FullName, FileMode.Open, FileAccess.Read))
                {
                    using (var reader = new BinaryReader(fstream))
                    {
                        fstream.Seek(0x14, SeekOrigin.Begin);
                        var flags = reader.ReadUInt32();
                        if ((flags & 0x01) == 1)
                        {
                            fstream.Seek(0x4c, SeekOrigin.Begin);
                            var itemIdLength = reader.ReadUInt16();
                            fstream.Seek(itemIdLength, SeekOrigin.Current);
                        }
                        var start = fstream.Position;
                        var length = reader.ReadUInt32();
                        fstream.Seek(0x0c, SeekOrigin.Current);
                        var offset = reader.ReadUInt32();
                        fstream.Seek(start + offset, SeekOrigin.Begin);
                        return new string(reader.ReadChars((int)(start + length - fstream.Position)));
                    }
                }
            }
            else
                return file.FullName;
        }

суббота, 16 июня 2012 г.

WPF clock

Ещё одни электронные часы, только теперь на WPF. Всё делается намного прощё, хотя впринципе и в Win Form можно было бы сделать так же.



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Windows.Threading;

namespace MyTimer
{
       
       /// 
       /// Interaction logic for MainWindow.xaml
       /// 
       
       
       public partial class MainWindow : Window
       {
              DispatcherTimer timer;
              
              public MainWindow()
              {
                     this.InitializeComponent();

                     timer = new DispatcherTimer();
                     timer.Interval = TimeSpan.FromSeconds(1.0);
                     timer.Start();
                     timer.Tick += new EventHandler(delegate(object s, EventArgs a)
        {
                     
                       tb.Text = "" + DateTime.Now.Hour +":"
                     + DateTime.Now.Minute +":"
                     + DateTime.Now.Second;
              
         
        });
              }
                     
       }
}

среда, 18 апреля 2012 г.

Кнопка STOP

Иногда нужно сделать кнопку, которая останавливала какой-нибудь процесс. (кнопку делал в Win Form' е и WPF) В моём случае я писал генератор случайных последовательностей с бесконечным циклом генерации, мне нужно было остановить генерацию. Самый просто способ создания кнопки Stop:
1 - нужно создать глобальную переменную (булевскую) 

private bool stop = false;

2 - прописать эту переменную перед циклом, который нужно остановить. Пример:

stop = false;
for (int i = 0; i < 10; i++)
            {

                тело цикла
            }

3 - вставить проверку на true или false данной переменной в тело цикла

stop = false;
for (int i = 0; i < 10; i++)
            {

                if (stop == true) break;
            }

4 - сделать кнопку, которая будет изменять значение нашей переменной. Пример:


        private void button2_Click(object sender, RoutedEventArgs e)
        {
            stop = true;
        }

Кнопка готова к работе)

Кнопка очистки всех TextBox' ов на форме в WPF

Задача: на форме есть n - колличество TextBox'ов, их нужно очистить все одновременно нажатием одной кнопки.
Делаем функцию:

void LoopVisualTree(DependencyObject obj)//обнуление текст боксов
        {
            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
            {

                if (obj is TextBox)
                {
                    ((TextBox)obj).Text = null;
                }
                // РЕКУРСИЯ
                LoopVisualTree(VisualTreeHelper.GetChild(obj, i));
            }

        }

Потом нажимаем на кнопку на форме 2 раза, чтобы перейти в её обработчик и прописываем там(пример!!!!):

private void button10_Click(object sender, RoutedEventArgs e)
        {
           
            LoopVisualTree(this);
                        
        }

Application.DoEvents в WPF

В Win Form есть матод Application.DoEvents, который обрабатывает все сообщения Windows, которые в данный момент находятся в очереди сообщений.
Но в WPF его нет. Его можно создать сделав вот такой метод:


public static void DoEvents()//Реализация DoEvents в WPF
        {
            if (Application.Current != null)
                Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, new ThreadStart(delegate { }));
        }

Затем, в тело самой программы просто нужно добавить DoEvents(), и бедет работать так же, как если бы это был  Application.DoEvents в Win Forme.

вторник, 27 марта 2012 г.

электронные часы на C#

Блог создал исключительно для себя в первую очередь, чтобы не забыть важные вещи.

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

Первая запись будет посвящена написанию электронных часов на C#.
Для начала нужно создать новый проект WPF.
На форму кидаем Label и Timer. Устанавливаем размер формы 800/300 (ширина и высота).
Затем дважды нажимаем мышкой на форму, чтобы перейти к написанию кода.
Вот сам код:

namespace Clock
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            nastroiki_formi();//вызываем функцию, чтобы всё работало
        }

        public void nastroiki_formi() 
        {
            label1.Text = "";
            FontFamily Label_shrift = new FontFamily("Digit");//шрифт
            System.Drawing.Color cvet_formi;
            cvet_formi = System.Drawing.Color.Black;//цвет формы
            this.BackColor = cvet_formi;//фон(за цвет отвечает BackColor)
            label1.Font = new Font(Label_shrift, 80, FontStyle.Regular);//присвоили Лэйблу шрифт
            this.Text = "Clock";
            System.Drawing.Color label_shrift_color;
            label_shrift_color = System.Drawing.Color.White;
            label1.ForeColor = label_shrift_color;//цвет лейбла (за цвет отвечает ForeColor)
            //две переменные для размещения в центре формы часов
            int x = this.Size.Width / 3;
            int y = this.Size.Height / 3;
            //Значения передаем в свойство Location (отвечает за координаты верхнего левого угла Label)
            label1.Location = new System.Drawing.Point(x, y);
            //указываем максимальный и минимальный размер формы
            this.MaximumSize = new Size(1000, 350);
            this.MinimumSize = new Size(1000, 350);
            //активируем таймер
            timer1.Enabled = true;
            timer1.Interval = 1;
            
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            //Заносим в Label текущее время используя свойства Now и DateTime
            //Чтобы присвоить время Label нужно воспользоваться ToLongTimeString()
            label1.Text = DateTime.Now.ToLongTimeString();
        }
    }
}

Часы готовы!
На youtube есть видео с точно такими же часами. Ссылка http://www.youtube.com/watch?v=yVpFxqiIgcw