Hỏi đáp

Chia sẻ kiến thức, cùng nhau phát triển

Picturebox di chuyển theo đường khi nhập tọa độ

02:34 26-04-2018 844 lượt xem 3 bình luận 20:04 26-04-2018

Xin chào moi người, em có một picturebox, khi e nhập tọa độ (x,y) vào textbox thì tọa độ của nó thay đổi theo giá trị e nhập vào. Ở đây e dùng thuộc tính location, thì picturebox nó nhảy lập tức tới tọa độ e nhập luôn, giờ e muốn giả như e nhập (8,9) thì picturebox nó sẽ di chuyển theo x 8 đơn vị, rồi di chuyển theo y 9 đơn vị (hoặc ngược lại) thì phải làm sao ạ. Em cảm ơn.w

Bình luận

Để bình luận, bạn cần đăng nhập bằng tài khoản Howkteam.

Đăng nhập
C# learner đã bình luận 20:04 26-04-2018

Vẫn đề 1: Thread

Bạn nhớ anh Long dạy là khi 1 thread đang tính toán thì sẽ gây ra blocking (Xem thêm bài Thread trong C# Winfrom Application hay Async Programming - Cái này là ông làm ở .NET nói nếu bạn học giỏi Tiếng Anh thì nghe, cặn cẽ lắm) khi blocking thì cái thread bạn đang dùng sẽ không handle UI đến khi cái code chạy xong như vậy cần 1 thread khác handle code của bạn 

Thread là gì

A process with two threads of execution, running on a single processor. In computer architecture, multithreading is the ability of a central processing unit (CPU) or a single core in a multi-core processor to execute multiple processes or threads concurrently, appropriately supported by the operating system.

Tạo thread có 3 cách 2 cách là kiểu bthg cách còn lại là Winform Application hỗ trợ sẵn

//Cách 1:
Thread thd = new Thread(() => {//Code ở đây});
Task thd = new Task(() => {//Code ở đây});

//Cách 2:
public async Task<//Return Type> AMethodName()
{
//Code ở đây;
}


//Cách 3: Winform hỗ trợ
BackgroundWorker name = new BackgroundWorker();
name.DoWork += AWorkerMethod;

private void AWorkerMethod(object sender, EventArgs e)
{
//Code ở đây
}

2 cách đầu sẽ ra lỗi (Excception) vì 2 thread không đc dành resource của nhau. Để trảnh lỗi này thì dùng: Đọc thêm ở đây

this.CheckForIllegalCrossThreadCalls = false;

Cái này không khuyến khích sử dụng, và lên C# WPF thì nó cũng bị bỏ đi nên để cho code mạnh thì dùng .Invoke(). Cái này thì mình chịu vì lười, nhưng lên WPF thì có 1 Method như sau:

Dispatcher.Invoke(System.Delegate action);
Dispatcher.Invoke(Action, DispatcherPriority);
Dispatcher.BeginInvoke(Action, DispatcherPriority); //Cái này async

Vẫn đề 2: Animation,

Vì lúc đấy cái vị trí bạn đặt cho picturebox là ở đó lun (Mình cho rằng bạn cho code vào thread hoặc binding) nếu bạn muốn cho nó có animation thì phải cho nó dịnh 1 ít một rồi cho thread nghỉ 1 - 50 milisecond 

Note

Chúc bạn thành công nha mà bonus cho bạn  thêm là trong C# WPF có cái storyboard và DoubleAnimation tiện lắm, nó tự animation cho mình luôn. 

Ví dụ nè

(C#)
DoubleAnimation animationLogo = new DoubleAnimation(1, 0, TimeSpan.FromSeconds(1));
Control1.BeginAnimation(OpacityProperty, animationLogo);
//Đổi opcatityProperty = property bạn muốn
-------------------------------------------------------------------------------
(XAML)
<!-- thay controls và thuộc tính bạn muốn-->
         <Image x:Name="img" Stretch="Uniform" Margin="205" Source="{Binding Logo}">
            <Image.Style>
                <Style>
                    <Style.Triggers>
                        <EventTrigger RoutedEvent="Image.Loaded">
                            <BeginStoryboard>
                                <Storyboard>
                                    <DoubleAnimation Duration="0:0:0.5" Storyboard.TargetProperty="Opacity" From="0" To="1"></DoubleAnimation>
                                </Storyboard>
                            </BeginStoryboard>
                        </EventTrigger>
                    </Style.Triggers>
                </Style>
            </Image.Style>
        </Image>

 

Lê Châu Moderator, Author đã bình luận 10:22 26-04-2018

Cái này hồi trước mình làm Java phải dùng đa tiến trình, nó thực hiện như phim hoạt hình hay game á. Bạn xem C# làm đa tiến trình được không

Nguyễn Thái Hải đã bình luận 06:27 26-04-2018

Cho vòng lặp for cho nó dịch chuyển  8,9 đơn vị theo giá trị bạn truyền vào, mỗi lần tăng lên 1 đơn vị :D . tức phải xét location(xét point của nó liên tục)

Câu hỏi mới nhất