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

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

вторник, 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;
        }