Тэги

Silverlight (36) WPF (10) IIS (7) Visual Studio (7) SharePoint (6) .Net Framework (5) ODP.NET (5) ASP.NET (4) C# (4) common (4) Network Settings (3) JavaScript (2) MS Office (2) Resharper (2) WCF (2) WEB (2) XPath (2) XSLT (2) ADO.NET (1) APEX (1) CMD (1) CSS (1) EF (1) HTML (1) Hardware bugs (1) Java (1) MS SQL (1) Oracle (1) PDF (1) Version Control (1) XAML (1)

суббота, 31 октября 2009 г.

Дополнение к предыдущему посту “Темы в Silverlight Toolkit October убивают валидацию в TextBox. Т.е. валидационный View. Видимо так было раньше и пока так будет, но это несложно поправить.”.



Предыдущий пост: Темы в Silverlight Toolkit October убивают валидацию в TextBox. Т.е. валидационный View. Видимо так было раньше и пока так будет, но это несложно поправить.

Продолжение предыдущего поста:

А вот безобразие, которое было до этого:
___________
<!--Textbox-->
<Style TargetType="TextBox">
    <Setter Property="BorderThickness"
        Value="1"/>
    <Setter Property="Background"
        Value="{StaticResource ShadeBrush}"/>
    <Setter Property="Foreground"
        Value="#FF000000"/>
    <Setter Property="Padding"
        Value="2"/>
    <Setter Property="BorderBrush"
        Value="{StaticResource NormalBorderBrush}" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="TextBox">
                <Grid >
                    <vsm:VisualStateManager.VisualStateGroups>
                        <vsm:VisualStateGroup x:Name="CommonStates">
                            <vsm:VisualStateGroup.Transitions>
                                <vsm:VisualTransition GeneratedDuration="00:00:00.1"
                                    To="MouseOver"/>
                                <vsm:VisualTransition GeneratedDuration="00:00:00.1"
                                    To="ReadOnly"/>
                                <vsm:VisualTransition GeneratedDuration="00:00:00.1"
                                    To="Disabled"/>
                                <vsm:VisualTransition From="Normal"
                                    GeneratedDuration="00:00:00.3000000"
                                    To="MouseOver"/>
                                <vsm:VisualTransition From="MouseOver"
                                    GeneratedDuration="00:00:00.5000000"
                                    To="Normal"/>
                            </vsm:VisualStateGroup.Transitions>
                            <vsm:VisualState x:Name="Normal"/>
                            <vsm:VisualState x:Name="MouseOver">
                                <Storyboard>
                                    <DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
                                               Duration="00:00:00.0010000"
                                               Storyboard.TargetName="HoverBorder"
                                               Storyboard.TargetProperty="(UIElement.Opacity)">
                                        <SplineDoubleKeyFrame KeyTime="00:00:00"
                                        Value="1"/>
                                    </DoubleAnimationUsingKeyFrames>
                                </Storyboard>
                            </vsm:VisualState>
                            <vsm:VisualState x:Name="Disabled">
                                <Storyboard>
                                    <DoubleAnimationUsingKeyFrames Storyboard.TargetName="DisabledVisualElement"
                                               Storyboard.TargetProperty="Opacity">
                                        <SplineDoubleKeyFrame KeyTime="0"
                                        Value="0.6"/>
                                    </DoubleAnimationUsingKeyFrames>
                                </Storyboard>
                            </vsm:VisualState>
                            <vsm:VisualState x:Name="ReadOnly">
                                <Storyboard>
                                    <DoubleAnimationUsingKeyFrames Storyboard.TargetName="ReadOnlyVisualElement"
                                               Storyboard.TargetProperty="Opacity">
                                        <SplineDoubleKeyFrame KeyTime="0"
                                        Value="1"/>
                                    </DoubleAnimationUsingKeyFrames>
                                </Storyboard>
                            </vsm:VisualState>
                        </vsm:VisualStateGroup>
                        <vsm:VisualStateGroup x:Name="FocusStates">
                            <vsm:VisualStateGroup.Transitions>
                                <vsm:VisualTransition From="Focused"
                                    GeneratedDuration="00:00:00.5000000"
                                    To="Unfocused"/>
                                <vsm:VisualTransition From="Unfocused"
                                    GeneratedDuration="00:00:00.3000000"
                                    To="Focused"/>
                            </vsm:VisualStateGroup.Transitions>
                            <vsm:VisualState x:Name="Focused">
                                <Storyboard>


                                    <DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
                                               Duration="00:00:00.0010000"
                                               Storyboard.TargetName="FocusVisualElement"
                                               Storyboard.TargetProperty="(UIElement.Opacity)">
                                        <SplineDoubleKeyFrame KeyTime="00:00:00"
                                        Value="1"/>
                                    </DoubleAnimationUsingKeyFrames>
                                </Storyboard>
                            </vsm:VisualState>
                            <vsm:VisualState x:Name="Unfocused">
                                <Storyboard>
                                    <DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
                                               Duration="00:00:00.0010000"
                                               Storyboard.TargetName="FocusVisualElement"
                                               Storyboard.TargetProperty="(UIElement.Opacity)">
                                        <SplineDoubleKeyFrame KeyTime="00:00:00"
                                        Value="0"/>
                                    </DoubleAnimationUsingKeyFrames>
                                </Storyboard>
                            </vsm:VisualState>
                        </vsm:VisualStateGroup>
                    </vsm:VisualStateManager.VisualStateGroups>
                    <Border x:Name="Border"
                Opacity="1"
                Background="{TemplateBinding Background}"
                BorderBrush="{TemplateBinding BorderBrush}"
                BorderThickness="{TemplateBinding BorderThickness}"
                CornerRadius="2,2,2,2">
                        <Grid>
                            <Border x:Name="ReadOnlyVisualElement"
                    Opacity="0"
                    Background="#72F7F7F7"/>
                            <Border BorderThickness="1"
                    CornerRadius="1,1,1,1">
                                <Border.BorderBrush>
                                    <SolidColorBrush Color="Transparent"
                                 x:Name="MouseOverColor"/>
                                </Border.BorderBrush>
                                <ScrollViewer BorderThickness="0"
                            IsTabStop="False"
                            Padding="{TemplateBinding Padding}"
                            x:Name="ContentElement"/>
                            </Border>
                        </Grid>
                    </Border>
                    <Border x:Name="HoverBorder"
                Opacity="0"
                BorderBrush="{StaticResource NormalBrush}"
                BorderThickness="2,2,2,2"
                CornerRadius="2,2,2,2"/>
                    <Border x:Name="DisabledVisualElement"
                IsHitTestVisible="False"
                Opacity="0"
                Background="#FFFFFFFF"
                BorderBrush="#A5F7F7F7"
                BorderThickness="{TemplateBinding BorderThickness}"
                CornerRadius="2,2,2,2"/>
                    <Border Margin="1"
                x:Name="FocusVisualElement"
                IsHitTestVisible="False"
                Opacity="0"
                BorderBrush="{StaticResource NormalBrush}"
                BorderThickness="2.1,2.1,2.1,2.1"
                CornerRadius="0.2,0.2,0.2,0.2"/>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>


Темы в Silverlight Toolkit October убивают валидацию в TextBox. Т.е. валидационный View. Видимо так было раньше и пока так будет, но это несложно поправить.



Если использовать темы из Silverlight Toolkit, то сразу бросается в глаза, что при их применениее сразу убивается View для валидации в TextBox.
Не знаю с чем связано такое безобразие, но вернуть это все несложно. Для этого нужно выполить следующее:

Рассмотрим стандартно применяемые стиль и шаблоны для TextBox на странице TextBox Styles and Templates (En)

Оттуда скопируем в наш файл, взятой из Silverlight Toolkit темы, “ControlTemplate for ValidationTooltip”.
<ControlTemplate x:Key="ValidationToolTipTemplate">

</ControlTemplate>
Поскольку к этому шаблону из стиля TextBox идет обращение, как к статическому ресурсу по имени ValidationToolTipTemplate, то размещать его XAML надо до XAML стиля TextBox.

Далее нам осталось только дополнить недостающие части XAML стиля для TextBox
<Style TargetType="TextBox">

</Style>

Сравните аккуратно исходный стиль и стиль в вашей теме и вы легко определите место куда вставить недостающие VisualState’ы и <Border x:Name="ValidationErrorElement" … >

Для полноты картины я приведу то что должно получиться, а то что быо до этого приведу в следующем посту, тк получается слишком большой объем

Вот что должно получиться:
___________
    <!--TextBox-->
    <!-- i!t для TextBox пришлось добавлять (возвращать) разметку и VisualState's для валидации
   
http://iliya-tretyakov.spaces.live.com/blog/cns!6DDCA30C11FA5050!504.entry
    -->
    <ControlTemplate x:Key="ValidationToolTipTemplate">
        <Grid x:Name="Root" Margin="5,0" RenderTransformOrigin="0,0" Opacity="0">
            <Grid.RenderTransform>
                <TranslateTransform x:Name="xform" X="-25"/>
            </Grid.RenderTransform>
            <vsm:VisualStateManager.VisualStateGroups>
                <vsm:VisualStateGroup Name="OpenStates">
                    <vsm:VisualStateGroup.Transitions>
                        <vsm:VisualTransition GeneratedDuration="0"/>
                        <vsm:VisualTransition To="Open" GeneratedDuration="0:0:0.2">
                            <Storyboard>
                                <DoubleAnimation Storyboard.TargetName="xform" Storyboard.TargetProperty="X" To="0" Duration="0:0:0.2">
                                    <DoubleAnimation.EasingFunction>
                                        <BackEase Amplitude=".3" EasingMode="EaseOut"/>
                                    </DoubleAnimation.EasingFunction>
                                </DoubleAnimation>
                                <DoubleAnimation Storyboard.TargetName="Root" Storyboard.TargetProperty="Opacity" To="1" Duration="0:0:0.2"/>
                            </Storyboard>
                        </vsm:VisualTransition>
                    </vsm:VisualStateGroup.Transitions>
                    <vsm:VisualState x:Name="Closed">
                        <Storyboard>
                            <DoubleAnimation Storyboard.TargetName="Root" Storyboard.TargetProperty="Opacity" To="0" Duration="0"/>
                        </Storyboard>
                    </vsm:VisualState>
                    <vsm:VisualState x:Name="Open">
                        <Storyboard>
                            <DoubleAnimation Storyboard.TargetName="xform" Storyboard.TargetProperty="X" To="0" Duration="0"/>
                            <DoubleAnimation Storyboard.TargetName="Root" Storyboard.TargetProperty="Opacity" To="1" Duration="0"/>
                        </Storyboard>
                    </vsm:VisualState>
                </vsm:VisualStateGroup>
            </vsm:VisualStateManager.VisualStateGroups>


            <Border Margin="4,4,-4,-4" Background="#052A2E31" CornerRadius="5"/>
            <Border Margin="3,3,-3,-3" Background="#152A2E31" CornerRadius="4"/>
            <Border Margin="2,2,-2,-2" Background="#252A2E31" CornerRadius="3"/>
            <Border Margin="1,1,-1,-1" Background="#352A2E31" CornerRadius="2"/>


            <Border Background="#FFDC000C" CornerRadius="2"/>
            <Border CornerRadius="2">
                <TextBlock
                  UseLayoutRounding="false"
                  Foreground="White" Margin="8,4,8,4" MaxWidth="250" TextWrapping="Wrap" Text="{Binding (Validation.Errors)[0].ErrorContent}"/>
            </Border>
        </Grid>
    </ControlTemplate>
    <Style TargetType="TextBox">
        <Setter Property="BorderThickness"
            Value="1"/>
        <Setter Property="Background"
            Value="{StaticResource ShadeBrush}"/>
        <Setter Property="Foreground"
            Value="#FF000000"/>
        <Setter Property="Padding"
            Value="2"/>
        <Setter Property="BorderBrush"
            Value="{StaticResource NormalBorderBrush}" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="TextBox">
                    <Grid >
                        <vsm:VisualStateManager.VisualStateGroups>
                            <vsm:VisualStateGroup x:Name="CommonStates">
                                <vsm:VisualStateGroup.Transitions>
                                    <vsm:VisualTransition GeneratedDuration="00:00:00.1"
                                        To="MouseOver"/>
                                    <vsm:VisualTransition GeneratedDuration="00:00:00.1"
                                        To="ReadOnly"/>
                                    <vsm:VisualTransition GeneratedDuration="00:00:00.1"
                                        To="Disabled"/>
                                    <vsm:VisualTransition From="Normal"
                                        GeneratedDuration="00:00:00.3000000"
                                        To="MouseOver"/>
                                    <vsm:VisualTransition From="MouseOver"
                                        GeneratedDuration="00:00:00.5000000"
                                        To="Normal"/>
                                </vsm:VisualStateGroup.Transitions>
                                <vsm:VisualState x:Name="Normal"/>
                                <vsm:VisualState x:Name="MouseOver">
                                    <Storyboard>
                                        <DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
                                                   Duration="00:00:00.0010000"
                                                   Storyboard.TargetName="HoverBorder"
                                                   Storyboard.TargetProperty="(UIElement.Opacity)">
                                            <SplineDoubleKeyFrame KeyTime="00:00:00"
                                            Value="1"/>
                                        </DoubleAnimationUsingKeyFrames>
                                    </Storyboard>
                                </vsm:VisualState>
                                <vsm:VisualState x:Name="Disabled">
                                    <Storyboard>
                                        <DoubleAnimationUsingKeyFrames Storyboard.TargetName="DisabledVisualElement"
                                                   Storyboard.TargetProperty="Opacity">
                                            <SplineDoubleKeyFrame KeyTime="0"
                                            Value="0.6"/>
                                        </DoubleAnimationUsingKeyFrames>
                                    </Storyboard>
                                </vsm:VisualState>
                                <vsm:VisualState x:Name="ReadOnly">
                                    <Storyboard>
                                        <DoubleAnimationUsingKeyFrames Storyboard.TargetName="ReadOnlyVisualElement"
                                                   Storyboard.TargetProperty="Opacity">
                                            <SplineDoubleKeyFrame KeyTime="0"
                                            Value="1"/>
                                        </DoubleAnimationUsingKeyFrames>
                                    </Storyboard>
                                </vsm:VisualState>
                            </vsm:VisualStateGroup>
                            <vsm:VisualStateGroup x:Name="FocusStates">
                                <vsm:VisualStateGroup.Transitions>
                                    <vsm:VisualTransition From="Focused"
                                        GeneratedDuration="00:00:00.5000000"
                                        To="Unfocused"/>
                                    <vsm:VisualTransition From="Unfocused"
                                        GeneratedDuration="00:00:00.3000000"
                                        To="Focused"/>
                                </vsm:VisualStateGroup.Transitions>
                                <vsm:VisualState x:Name="Focused">
                                    <Storyboard>


                                        <DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
                                                   Duration="00:00:00.0010000"
                                                   Storyboard.TargetName="FocusVisualElement"
                                                   Storyboard.TargetProperty="(UIElement.Opacity)">
                                            <SplineDoubleKeyFrame KeyTime="00:00:00"
                                            Value="1"/>
                                        </DoubleAnimationUsingKeyFrames>


                                    </Storyboard>
                                </vsm:VisualState>
                                <vsm:VisualState x:Name="Unfocused">
                                    <Storyboard>
                                        <DoubleAnimationUsingKeyFrames BeginTime="00:00:00"
                                                   Duration="00:00:00.0010000"
                                                   Storyboard.TargetName="FocusVisualElement"
                                                   Storyboard.TargetProperty="(UIElement.Opacity)">
                                            <SplineDoubleKeyFrame KeyTime="00:00:00"
                                            Value="0"/>
                                        </DoubleAnimationUsingKeyFrames>
                                    </Storyboard>
                                </vsm:VisualState>
                            </vsm:VisualStateGroup>


                            <vsm:VisualStateGroup x:Name="ValidationStates">
                                <vsm:VisualState x:Name="Valid"/>
                                <vsm:VisualState x:Name="InvalidUnfocused">
                                    <Storyboard>
                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ValidationErrorElement" Storyboard.TargetProperty="Visibility">
                                            <DiscreteObjectKeyFrame KeyTime="0">
                                                <DiscreteObjectKeyFrame.Value>
                                                    <Visibility>Visible</Visibility>
                                                </DiscreteObjectKeyFrame.Value>
                                            </DiscreteObjectKeyFrame>
                                        </ObjectAnimationUsingKeyFrames>
                                    </Storyboard>
                                </vsm:VisualState>
                                <vsm:VisualState x:Name="InvalidFocused">
                                    <Storyboard>
                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ValidationErrorElement" Storyboard.TargetProperty="Visibility">
                                            <DiscreteObjectKeyFrame KeyTime="0">
                                                <DiscreteObjectKeyFrame.Value>
                                                    <Visibility>Visible</Visibility>
                                                </DiscreteObjectKeyFrame.Value>
                                            </DiscreteObjectKeyFrame>
                                        </ObjectAnimationUsingKeyFrames>
                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="validationTooltip" Storyboard.TargetProperty="IsOpen">
                                            <DiscreteObjectKeyFrame KeyTime="0">
                                                <DiscreteObjectKeyFrame.Value>
                                                    <sys:Boolean>True</sys:Boolean>
                                                </DiscreteObjectKeyFrame.Value>
                                            </DiscreteObjectKeyFrame>
                                        </ObjectAnimationUsingKeyFrames>
                                    </Storyboard>
                                </vsm:VisualState>
                            </vsm:VisualStateGroup>


                        </vsm:VisualStateManager.VisualStateGroups>
                        <Border x:Name="Border"
                    Opacity="1"
                    Background="{TemplateBinding Background}"
                    BorderBrush="{TemplateBinding BorderBrush}"
                    BorderThickness="{TemplateBinding BorderThickness}"
                    CornerRadius="2,2,2,2">
                            <Grid>
                                <Border x:Name="ReadOnlyVisualElement"
                        Opacity="0"
                        Background="#72F7F7F7"/>
                                <Border BorderThickness="1"
                        CornerRadius="1,1,1,1">
                                    <Border.BorderBrush>
                                        <SolidColorBrush Color="Transparent"
                                     x:Name="MouseOverColor"/>
                                    </Border.BorderBrush>
                                    <ScrollViewer BorderThickness="0"
                                IsTabStop="False"
                                Padding="{TemplateBinding Padding}"
                                x:Name="ContentElement"/>
                                </Border>
                            </Grid>
                        </Border>
                        <Border x:Name="HoverBorder"
                    Opacity="0"
                    BorderBrush="{StaticResource NormalBrush}"
                    BorderThickness="2,2,2,2"
                    CornerRadius="2,2,2,2"/>
                        <Border x:Name="DisabledVisualElement"
                    IsHitTestVisible="False"
                    Opacity="0"
                    Background="#FFFFFFFF"
                    BorderBrush="#A5F7F7F7"
                    BorderThickness="{TemplateBinding BorderThickness}"
                    CornerRadius="2,2,2,2"/>
                        <Border Margin="1"
                    x:Name="FocusVisualElement"
                    IsHitTestVisible="False"
                    Opacity="0"
                    BorderBrush="{StaticResource NormalBrush}"
                    BorderThickness="2.1,2.1,2.1,2.1"
                    CornerRadius="0.2,0.2,0.2,0.2"/>
                        <Border x:Name="ValidationErrorElement" BorderThickness="1" CornerRadius="1" BorderBrush="#FFDB000C" Visibility="Collapsed">
                            <ToolTipService.ToolTip>
                                <ToolTip x:Name="validationTooltip" Template="{StaticResource ValidationToolTipTemplate}" Placement="Right"
                         PlacementTarget="{Binding RelativeSource={RelativeSource TemplatedParent}}"
                         DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}}">
                                    <ToolTip.Triggers>
                                        <EventTrigger RoutedEvent="Canvas.Loaded">
                                            <EventTrigger.Actions>
                                                <BeginStoryboard>
                                                    <Storyboard>
                                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="validationTooltip" Storyboard.TargetProperty="IsHitTestVisible">
                                                            <DiscreteObjectKeyFrame KeyTime="0">
                                                                <DiscreteObjectKeyFrame.Value>
                                                                    <sys:Boolean>true</sys:Boolean>
                                                                </DiscreteObjectKeyFrame.Value>
                                                            </DiscreteObjectKeyFrame>
                                                        </ObjectAnimationUsingKeyFrames>
                                                    </Storyboard>
                                                </BeginStoryboard>
                                            </EventTrigger.Actions>
                                        </EventTrigger>
                                    </ToolTip.Triggers>
                                </ToolTip>
                            </ToolTipService.ToolTip>
                            <Grid Width="12" Height="12" HorizontalAlignment="Right" Margin="1,-4,-4,0" VerticalAlignment="Top" Background="Transparent">
                                <Path Margin="1,3,0,0" Data="M 1,0 L6,0 A 2,2 90 0 1 8,2 L8,7 z" Fill="#FFDC000C"/>
                                <Path Margin="1,3,0,0" Data="M 0,0 L2,0 L 8,6 L8,8" Fill="#ffffff"/>
                            </Grid>
                        </Border>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>


Выполнение произвольной промежуточной операции над данными внутривыражения LINQ

Первый абзац это теория и вступление, переходите к следующему, кто в теме
При написании LINQ постоянно появляется желание выполнить промежуточную операцию над данными. По науке это не правильно, т.к. пока производительность не страдает каждый цикл по данным должен служить отдельной роли. Ведь LINQ это и есть цикл, определенные на языке запросов. Но, тоже по науке :), код должен быть очевиден и однотипные или связанные операции сгруппированы.
Сразу ответ на тему поста:
Я использую выражение LINQ “let” для написание промежуточной операции, но с некоторым простым ухищрением. Вот пример:
var orgUnits = (
    from el in orgUnitsDict.Values
    // в промежуточной операции отсортируем элементы в дочернем объекте
    let dummy = el.Phones = el.Phones.OrderBy(p => p.PhoneStr).ToList()    orderby el.ParentId,
    el.IsGroup descending,
    el.Name
    select el
).ToList();
Описание:
В этом выражении из словаря объектов я получаю отсортированный список этих же объектов, но попутно, у меня стоит задача в каждом объекте отсортировать дочернюю коллекцию в свойстве Phones.
Директива let позволяет это сделать. А поскольку в директиве let обязательно должна создаваться промежуточная переменная, то я использую как затычку бесполезную переменную dummy, которая больше нигде не используется в запросе.
Также эту строчку
let dummy = el.Phones = el.Phones.OrderBy(p => p.PhoneStr).ToList()
вы можете заменить следующей
let dummy = el.Phones = MyMethod(el.Phones)
или даже так
let dummy = MyMethod(el)
т.е. можете применять свой произвольный метод для выолнения промежуточной операции,
главное, чтоб он хоть чего-нибудь возвращал.
Очень полезное образовательное надругательство над LINQ.
Веселых вам извратов, господа, если что, обращайтесь :).
Пожалуйста, если вы знаете другие подходы, то дайте знать. Там ссылочку киньте или напишите в комментариях.

четверг, 29 октября 2009 г.

ORA-06502: PL/SQL: numeric or value error: character string buffer toosmall

Ошибка на Oracle
ORA-06502: PL/SQL: numeric or value error: character string buffer too smallВ моем случае это связано с тем, что функция или процедура Oracle имеет возвращаемый парампетр Varchar2
и я использую ODP.NET и следующий код устанавливающий параметр на стороне ADO.NET (т.е. на стороне .NET Framework приложения):
oCom.Parameters.Add("o_name", OracleDbType.Varchar2, ParameterDirection.Output);
Неправильно, сказала Oracle всем :), надо использовать следующее извращение, сказала Оракля:
oCom.Parameters.Add("o_name", OracleDbType.Varchar2, 300, null, ParameterDirection.Output);
Здесь 300 – это размерность. Любая, но не меньше, чем вы ожидаете.
null – ну типа как изначальное значени.
Уже стотый раз спотыкаюсь на этом, но постоянно забываю об этой несуразности.
С облегчением :) !

воскресенье, 25 октября 2009 г.

Silverlight Drag And Drop. У Сильверлайта появился свой нормальный драг дроп с выходом Toolkit от октября 2009 года.



Очень хорошо!
Но оказалось, что это заметно тормозит при количестве элементов в списке от 500. Например, если в ListBox 3 000 элементов, то какая-либо реакция проявляется только через 5 секунд.
Пока проджекта не уговорю сделать пейджинг и фильтрацию, придется, для некоторых задач, продолжить пользоваться своим аналогичным фреймворком, который работает ваабще без задержек.
Но все равно стоит использовать решение из Toolkit, т.к., например, мое решение не умеет разворачивать ноды в TreeView. Недолго сделать, но прикручивать все такие мелочи – жизни не хватит :) .

Ниже источники и описание.

Блог Tim Heuer "Silverlight Toolkit adds DragDrop" EN – здесь ознакомительное описание, позволяющее начать работать с примером.
Silverlight Toolkit EN – а здесь исходник с примером.
Если вы хотите глубоко кастомизировать ваши решения, то нужно смотреть
New with the Silverlight Toolkit: Drag and Drop Support for all your Favorite Controls! (Part 1) и
Silverlight Toolkit Drag Drop (Part 2): Customizing Drag and Drop Behavior
Пример можно посмотреть в ToolKit (выберите в меню слева внизу) и у Tim Heuer.

Этот DragDrop строится на подходе WPF (слава богу) с такими же событиями. Даже можно писать переносимый код, соблюдая некоторые условия.
Идея этого Drag Drop в следуюещем, теперь можно для ListBox, TreeView, DataGrid и графиков (Charts) исполльзовать Драгэнддроп, если вложить их в соответствующий элемент:
  • ListBoxDragDropTarget

  • TreeViewDragDropTarget

  • DataGridDragDropTarget

  • DataPointSeriesDragDropTargetНо также можно применять подход на основе событий и регестрировать через свойства элементы учавствующие в Драг Анд Дроп.

    Важно, что решение можно глубоко кастомизировать и настраивать.
    Заявляется, что можно делать Drag Drop внутри одного контрола, но только в случае ListBox для этого нужно отключать виртуализационную панель. В приведенных выше ссылках об этом рассказано подробно.
    Также доступно перемещение за раз нескольких элементов при множественном выделении айтемов.

    Я за унификацию, поэтому буду переходить на новый Drag Drop, хотя уже привык к некоторым своим фичам, способам визуализации и регистрации источников и приемников Drag Drop.

  • Яндекс устал

    Никогда не задумывался, почему Яндекс непопулярен у активных и продвинутых пользователи интернета. Почему же предпочитают Google.
    Просто Яндекс медленный. Не хватает ресурсов, что бы оперативно проиндексировать весь интернет и поспевать за его изменениями и новостями.
    Там, видимо, посчитали, что если они будут активно переиндексировать популярный контент, то этого достаточно.
    Я люблю оба поисковика, но если мне нужна информация посвежее, я пользуюсь Google.
    Хотя Яндекс, бывает, что приятно удивляет :)

    Задание прикрепленного свойства в XALM. Set Attached Properties in XALM.

    Сразу несколько примеров, чтоб все стало ясно
    Вот эту запись:
    <Button Grid.Row=”1”>
        <TextBlock>1234567890</TextBlock>
    </Button>

    Можно записать так:
    <Button>
        <Grid.Row>
            1
        </Grid.Row>
        <TextBlock>1234567890</TextBlock>
    </Button>
    Пример из жизни:
    <Border>
        <vsm:VisualStateManager.VisualStateGroups>
            <vsm:VisualStateGroup x:Name="CommonStates">
                <vsm:VisualState x:Name="Normal" />
            </vsm:VisualStateGroup>
        </vsm:VisualStateManager.VisualStateGroups>
    </Border>
    Т.е. помимо задания прекрепленных свойств через атрибуты, их можно задавать в нодах XALM.
    Это очень хорошо пригодиться при кастомизации

    Сохраняем в SVN WCF Service References проекта на Silverlight



    Чтобы избежать путаницы с файлами Service References WCF клиента в проекте Silverlight 3 и позволить проекту компилироваться, стоит в SVN сохранять только файлы, содержащие в названии слово Reference. Это всего два файла: Reference.svcmap и Reference.cs. Все остальное добавте в Ignore list SVN, лучше по расширению, т.к. при генерации клиента в названии файлов могут добавлятьс числа.
    Мало того, вы можете физически удалить все что есть в папке Service References, кроме перечисленных выше двух файлов. При этом проект будет компилится и сервисы будут работать.
    При первом же вызове, из контекстного меню в Solition Explorer, Update Service Reference все удаленное восстановиться.

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

    SVN – система контроля версий
    WCF Service References – ссылки которые вы добавляете в клиентский проект, чтобы ему были доступны сервисы WCF, расположенные на хостовом проекте.

    суббота, 24 октября 2009 г.

    Silverlight: Утечки памяти. Memory leak



    Список приемов, которые создают утечки памяти (ресурсов) в Silverlight

    • Биндинг. Привязываем через <my:MyUI SourceUI="{Binding ElementName=MyElementName}"/>. Динамически удаляем или заменяем MyElementName. В свойстве зависимостей SourceUI останется ссылка на удаленный превый экземпляр MyElementName.
      Решение: не использовать привязку для динамически удаляемых элементов.

    • :) другого пока ничего не нашел, но есть сильные подозрения, что найду.


    вторник, 20 октября 2009 г.

    Silverlight 3 Binding ConverterParameter



    Можно передать в ConverterParameter не только значение созданное литералом в выражении привязки, но и объект. Для этого объетк нужно объявить на странице, как статический ресурс и использовать, например, следующее выражение привязки.

    ItemsSource="{Binding RelativeSource={RelativeSource Self}, Converter={StaticResource CompensationForPhone}, ConverterParameter={usercontrols:SubscriptionLayoutUiAccessor}}"

    Но прежде чем так делать, подумайте, не лучше ли сделать привязанный к определенному UI IValueConverter и доставать в нем нужные элементы UI из статических свойств.

    воскресенье, 18 октября 2009 г.

    Silverlight: Корректное манипулирование фокусом при его потере



    Вам нужно при нажатии на кнопку анимировать ее и на время анимации заблокировать ее от пользователя. Если блокировать кнопку через IsEnebled=false, (подскажите мне дроугой способ) то фокус переходит на следующий в дереве элемент управления принимающий фокус.
    Например в моем случае я блокирую кнопку Save и получаю фокус на кнопке Delete, что ужасно :)
    Дружественно решить это поможет задание фокуса на корневом элементе Application.Current.RootVisual перед или сразу после установки myButton.IsEnebled=false.
    Единственное ограничение, которое легко обойти, не выставляйте, при старте приложения Silverlight, в RootVisual элемент не наследуемый от Conrol.
    Если вы оставите все как есть, то в RootVisual будет UserConrol, что нам и нужно. Если вас не ломает и не выворачивает жестоко, то вы так и сделаете :)

    А вот желанный кусочек кода
    public static class UiUtilsCommon
    {

        // …

        /// <summary>
        /// Снятие фокуса с текущего элемента и постановка его на RootVisual.
        /// Используется когда на элементе принимающем фокус нужно задать IsEnebled=false, например в анимации, при этом фокус автоматически переходит на следующий в дереве
        /// элемент управления, что часто не желательно, поэтому можно демократично установить фокус на RootVisual
        /// </summary>
        public static void TrySetFocusOnRootVisual()
        {
            // т.к. в RootVisual при запуске приложения можно задать любой UI, то этот функционал не будет работать если RootVisual не неаследуется от Control, защитимся от этого
            try
            {
                ((Control)Application.Current.RootVisual).Focus();
            }
            catch { }
        }

        // …

    }

    четверг, 8 октября 2009 г.

    Ошибка - Компонент "75a0fea7-12fe-4cad-a1b2-525fa776c07e" не установленв данной ферме и не может быть добавлен в эту область

    Ого, сказал я себе, когда ничего не нашел подобного в поисковиках!
    Компонент "75a0fea7-12fe-4cad-a1b2-525fa776c07e" не установлен в данной ферме и не может быть добавлен в эту область.
    У меня это связано со следующим:
    Решил накатить один из шаблонов приложений Windows SharePoint Services 3.0, который для администраторов сервера, т.е. ставиться на уровне сервера из командной строки.
    Но забыл про то, что нужно сначала выполнить установку обязательного шаблона Application Template Core.
    Т.е. я об этом помнил, но у меня уже столько накопилось разработческих сред, что я и не помню где установлен Template Core :).
    Для проверки зайдите в Центр администрирования (Старт – Пуск / Administrative Tools / Центр администрирования SharePoint 3.0). Когда откроется браузер, в нем зайдите в Центр администрирования > Операции > Управление решениями и проверте, что у вас установлено решение “applicationtemplatecore.wsp
    Установить Application Template Core из командной строки можно следующими строками:
    %PROGRAMFILES%\common files\microsoft shared\web server extensions\12\bin\stsadm" -o addsolution -filename "C:\WssTemplates\!ServerAdminTemplates\ApplicationTemplateCore.wsp"
    %PROGRAMFILES%\common files\microsoft shared\web server extensions\12\bin\stsadm" -o deploysolution -name ApplicationTemplateCore.wsp -allowgacdeployment –immediate
    %PROGRAMFILES%\common files\microsoft shared\web server extensions\12\bin\stsadm" -o copyappbincontent
    Только замените файловый путь на ваш (красные символы).
    Скачивается это вместе со всеми “Шаблоны приложений Windows SharePoint Services 3.0”, ну может и отдельно можно скачать :). Там же в архиве есть redme.txt файлик, расказывающий, как надо устанавливать.
    Еще раз, называется это - решение Application Template Core – ApplicationTemplateCore.wsp

    stsadm Нет доступа

    Столкнулся с проблемой при установке шаблона SharePoint на уровне сервера.
    Такие шаблоны устанавливаются только из командной строки через Windows SharePoint Services administration tool STSADM.EXE
    Эта штука лежит в %PROGRAMFILES%\common files\microsoft shared\web server extensions\12\bin\
    Дак во, при любом вызова stsadm я получал сообщение “Нет доступа”.
    Гугл сказал, что Нужны были права админа в базе данных, но мне некогда было разбираться с правами, я вспомнил, что устанавливал SharePoint (в моем разработческом случае это WSS) под учеткой Administrator, зашел под ней и все установил.
    Причем пришлось поменять пароль администраторской встроенной учетке, тк забыл :)
    Кстати, вот сразу полезные строчки для установления шаблонов на уровне сервера через командную строку
    Установка шаблона
    =
    "%PROGRAMFILES%\common files\microsoft shared\web server extensions\12\bin\stsadm" -o addsolution -filename "C:\WssTemplates\KnowledgeBase.wsp"
    "%PROGRAMFILES%\common files\microsoft shared\web server extensions\12\bin\stsadm" -o deploysolution -name KnowledgeBase.wsp -allowgacdeployment -immediate
    Удаление
    =
    "%PROGRAMFILES%\common files\microsoft shared\web server extensions\12\bin\stsadm" -o retractsolution -name <template_name>.wsp
    "%PROGRAMFILES%\common files\microsoft shared\web server extensions\12\bin\stsadm" -o deletesolution -name <template_name>.wsp
    замените пути до ваших шабллонов WSP в “Установке” и имя шаблона в “Удалении”

    четверг, 1 октября 2009 г.

    ”Введение в Microsoft Silverlight 3” от Лоуренса Морони – книга агвно.



    Книга действительно агвно, разве что на русском. Даже Microsoft WPF-Silverlight Comparison Whitepaper  http://wpfslguidance.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=28278 содержит больше информации!Это даже не введение, это рекламный проспект какой-то! Потивно читать, что не возмешь посмотреть по работе, одни белые пятна.
    Я считаю эту книгу вредной для разработчика.Мой совет, используйте хорошую книгу по WPF (помимо блогов и MSDN, и прочего конечно), там материала больше на порядки.Надеюсь скоро выпустят что-то приличное для Silverlight 3.”Введение в Microsoft Silverlight 3” от Лоуренса Морони
    Microsoft WPF-Silverlight Comparison Whitepaper