Изскачащ контрол с възможност за плъзгане в wpf

Имам нужда от плъзгаща се изскачаща контрола в wpf и се чудех дали някой от вашите момчета може да ми помогне. Видях следната публикация:

Изскачащ прозорец с плъзгане на WPF

но не трябва ли така да работи...? Когато щракна и плъзна, винаги се нулира до определена точка и освен това коментиращите казаха, че това не е ефективен подход...? Някой има ли алтернативи?

Благодаря!


person Dan    schedule 24.01.2011    source източник
comment
както се казва в свързания въпрос, вероятно трябва да използвате палец вместо изскачащ прозорец   -  person Robert Levy    schedule 24.01.2011
comment
Може ли използването на палец да премести изскачащия прозорец, когато мишката се премести...? Не мисля така..доколкото знам...? имате ли пример за това как можем да използваме палец, за да плъзгаме? Благодаря! съжалявам, аз съм начинаещ в wpf...така че ако въпросите ми изглеждат глупави...извинявам се...:)   -  person Dan    schedule 24.01.2011


Отговори (2)


Можете да отворите дъщерен прозорец с персонализирано оформление на рамката. След това добавете манипулатор MouseDown, който позволява плъзгането:

<Window 
        WindowStyle="None"
        ShowInTaskbar="False"
        ResizeMode="NoResize"
        SizeToContent="Height"
        MouseDown="Window_MouseDown">
...
</Window>

В кода отзад:

    private void Window_MouseDown(Object sender, MouseButtonEventArgs e)
    {
        this.DragMove();
    }
person matthias.lukaszek    schedule 24.01.2011
comment

Искам да заредя div от външен източник, след като страницата се зареди с известно забавяне.

Ето скрипта jquery, който имам. Това, което се случва, е, че първо се зарежда съдържанието и след това loader.gif по-късно. Как мога да покажа съдържание от външен източник след известно време xx..? Имам идея за функцията .load(), но не съм сигурен как да я приложа.

$(window).load(function() {
$('<div id="overlay"><img src="loading.gif" /></div>')
.css('opacity', '0.5')
.insertAfter('body');

window.setTimeout(function() {
$(document).ready(function() {
$('#overlay').remove();
});}, 1000);
$('.body').show();
});

<div id="container">
<div id="header">navigation</div>
<div id="body" class="body">Body</div>
<div id="footer">footer</div>
</div>


#overlay {
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
background: gray;
}

.body{display:none;}

#overlay img {
 display: block;
 width: 32px;
 height: 32px;
 position: absolute;
 top: 50%;
 left: 50%;
 margin: -26px 0 0 -26px;
 padding: 10px;
 background: #fff;
 -moz-border-radius: 6px;
 border-radius: 6px;
}
- person Dan; 24.01.2011
comment
Как да задам позицията на прозореца спрямо конкретна контрола и да разреша да се плъзга само в границите на друг прозорец? - person Dan; 24.01.2011
comment
Позиционирането на прозореца трябва да е възможно чрез задаване на Window.Left и Window.Top след определяне на позицията с PointToScreen(...). Не знам как да го закрепя към друг прозорец. - person matthias.lukaszek; 24.01.2011

Можем да напишем поведение, за да направим всяко Popup плъзгащо се. Ето примерен XAML на изскачащ прозорец, свързан с текстово поле, което се отваря и остава отворено, когато текстовото поле е фокусирано:

<Grid>
    <StackPanel>
        <TextBox x:Name="textBox1" Width="200" Height="20"/>
    </StackPanel>
    <Popup PlacementTarget="{Binding ElementName=textBox1}" IsOpen="{Binding IsKeyboardFocused, ElementName=textBox1, Mode=OneWay}">
        <i:Interaction.Behaviors>
            <local:MouseDragPopupBehavior/>
        </i:Interaction.Behaviors>
        <TextBlock Background="White">
            <TextBlock.Text>Sample Popup content.</TextBlock.Text>
        </TextBlock>
    </Popup>
</Grid>

Ето поведението, което ни позволява да плъзгаме Popup:

public class MouseDragPopupBehavior : Behavior<Popup>
{
    private bool mouseDown;
    private Point oldMousePosition;

    protected override void OnAttached()
    {
        AssociatedObject.MouseLeftButtonDown += (s, e) =>
        {
            mouseDown = true;
            oldMousePosition = AssociatedObject.PointToScreen(e.GetPosition(AssociatedObject));
            AssociatedObject.Child.CaptureMouse();
        };
        AssociatedObject.MouseMove += (s, e) =>
        {
            if (!mouseDown) return;
            var newMousePosition = AssociatedObject.PointToScreen(e.GetPosition(AssociatedObject));
            var offset = newMousePosition - oldMousePosition;
            oldMousePosition = newMousePosition;
            AssociatedObject.HorizontalOffset += offset.X;
            AssociatedObject.VerticalOffset += offset.Y;
        };
        AssociatedObject.MouseLeftButtonUp += (s, e) =>
        {
            mouseDown = false;
            AssociatedObject.Child.ReleaseMouseCapture();
        };
    }
}

Ако не сте запознати с поведението, инсталирайте Expression Blend 4 SDK и добавете тези пространства от имена:

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"

и добавете System.Windows.Interactivity към вашия проект.

person Rick Sladkey    schedule 24.01.2011
comment
Това е просто упражнение, за да накарате функцията да използва код отзад вместо това. Просто добавете манипулаторите и променете AssociatedObject на popup1. - person Rick Sladkey; 24.01.2011
comment
о, добре, страхотно...Така че просто трябва да заменя поведението със свързани събития mouseup mousedown в кода отзад, така ли е? (замяна на AssociatedObject с popup1) Благодаря! - person Dan; 24.01.2011